2011-12-16 40 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')