2014-04-28 43 views
0

我在SQL Server 2008中工作。我有4個表我想加入。我們稱它們爲表A,B,C和D. B,C和D是表A的所有子集。可能有一些在B,C和D之間常見的記錄。我的目標是選擇所有記錄在一個不在B,C或D.所以,我認爲正確的查詢運行是:SQL連接多個表 - 結果集不是預期

SELECT 
    A.x 
FROM A 
LEFT JOIN B 
ON A.x = B.y 
LEFT JOIN C 
ON A.x = C.z 
LEFT JOIN D 
ON A.x = D.i 
WHERE 
(
(B.y IS NULL) 
AND 
(C.z IS NULL) 
AND 
(D.i IS NULL) 
) 

我遇到的問題是,我知道,有表B中的一些記錄是返回的結果集不應該是。 (對於表C和D也是如此。)因此,我的查詢肯定有問題。我最好的猜測是聯結是模糊的。第一個應該給我A中所有不在B中的記錄。同樣,第二個應該給我A中所有不在C中的記錄。因爲我在WHERE子句中使用了AND,那麼我本質上應該返回只有每個連接共有的記錄。但是,有些事情出錯了。我該如何糾正?

+0

您的查詢必須工作。這種數據(類型,域)中存儲了哪種數據? –

回答

1

試試這個:

SELECT x FROM A 
EXCEPT 
SELECT x FROM 
(
    SELECT y FROM B UNION 
    SELECT z FROM C UNION 
    SELECT i FROM D 
) T(x) 
+0

事實證明,我寫的查詢應該返回一個正確的結果集。但是,由於使用了具有外連接的多個AND(即,LEFT JOIN),我需要使用連接運算符(+)(至少,這是Oracle的準則,不一定是SQL Server)。不過,我更喜歡你的查詢。 – user3100444