【问题标题】:CROSS JOIN filter交叉连接过滤器
【发布时间】:2012-01-22 02:52:37
【问题描述】:

我需要为查询“制造”记录,但同时限制从“查找”表返回的值列表。

有没有办法使用“过滤”CROSS JOIN 而不必求助于内联视图?

这个语法按预期工作(我得到了想要的结果):

SELECT  E.ID,  
        M.VALUE,
        MT.ID, MT.NAME

FROM    ENCOUNTER E
CROSS JOIN (
      SELECT  ID, NAME
      FROM    MEASUREMENT_TYPE
      WHERE   ID IN ('6941','6946')
) MT
LEFT OUTER JOIN MEASURE M ON E.ID=M.ENCOUNTER_ID
        AND MT.ID=M.MEASURE_TYPE_ID

不幸的是,如果我使用这种方法,我需要在 Crystal Reports 中使用 Command 对象,而不是其原生的“Visual Linking Expert”。命令对象激怒了我。

向 WHERE 子句添加过滤器会导致相等连接,这在这种情况下是不可取的。

【问题讨论】:

    标签: sql oracle crystal-reports cross-join


    【解决方案1】:
    SELECT
      E.ID,  
      M.VALUE,
      MT.ID,
      MT.NAME
    FROM
      ENCOUNTER         AS E
    CROSS JOIN
      MEASUREMENT_TYPE  AS MT
    LEFT OUTER JOIN
      MEASURE           AS M
        ON  E.ID  = M.ENCOUNTER_ID
        AND MT.ID = M.MEASURE_TYPE_ID
    WHERE
      MT.ID IN ('6941','6946')
    

    在这种情况下,您可以将过滤器放在 WHERE 子句中,因为它是一个 LEFT JOIN,并且您正在过滤查询的 左侧

    如果您要过滤 Measure 表,则过滤器必须进入 LEFT JOIN 的 ON 子句。


    另一个替代方法是 INNER JOIN 而不是 CROSS JOIN 并在那里使用过滤器。这是因为 ON 子句实际上并不需要引用两个表...

      ENCOUNTER         AS E
    INNER JOIN
      MEASUREMENT_TYPE  AS MT
        ON MT.ID IN ('6941','6946')
    

    【讨论】:

    • 那是无效的 SQL。 [] 是 SQL 标识符中的非法字符。
    • @a_horse_with_no_name - 愚蠢的甲骨文,这总是让我绊倒,而且我永远学不会。但我确实喜欢那些[] 所以:(
    • 您的答案被选中,因为它是唯一可以(几乎)在 Crystal Reports 中实现的答案。
    • @Dems:这不是愚蠢的甲骨文。这就是 SQL 标准所说的(SQL Server 是唯一接受这种奇怪符号的 DBMS)
    【解决方案2】:

    在这种情况下,inner join 的作用与您的cross join 相同。替换:

    CROSS JOIN (
          SELECT  ID, NAME
          FROM    MEASUREMENT_TYPE
          WHERE   ID IN ('6941','6946')
    ) MT
    

    INNER JOIN MEASUREMENT_TYPE MT ON MT.ID IN ('6941','6946')
    

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 2017-11-03
      • 2016-01-01
      • 2018-11-02
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2014-03-28
      相关资源
      最近更新 更多