交叉连接过滤器



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

是否有一种方法来使用"过滤器"交叉连接,而不必诉诸于使用内联视图?

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

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对象,而不是其原生的"可视化链接专家"。命令对象使我恼火。

在WHERE子句中添加一个过滤器会产生一个相等的连接,这在这种情况下是不希望出现的。

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')

在这种情况下,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')

最新更新