我需要为查询“制作”记录,但同时限制从“查找”表返回的值列表。
有没有办法在不必使用内联视图的情况下使用'过滤'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子句添加过滤器会导致相等的连接,这在这种情况下是不可取的。
答案 0 :(得分: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')
答案 1 :(得分:1)
在这种情况下,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')