2011-12-16 88 views
0

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

有没有办法使用'过滤器'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对象”。命令对象刺激我。

向WHERE子句中添加过滤器会导致相等的连接,这在此情况下不受欢迎。

回答

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

这是无效的SQL。 `[`和`]`是SQL标识符中的非法字符。 – 2011-12-16 16:45:23

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