我在SQL Server 2008中工作。我有4个表我想加入。让我们称它们为表A,B,C和D. B,C和D都是表A的子集。可能有一些在B,C和D中很常见的记录。我的目标是选择所有记录在A中不在B,C或D中。因此,我认为正确的查询运行是:
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)