回答
假設表A和表B具有名稱ID的主鍵。
select TableA.*
from TableA
left outer join TableB on TableB.id = TableA.id
where TableB.id is null;
這將查找表b沒有表a的id實例的所有條目。
你有你的術語錯誤。該intersection將是在這兩個表A和B表,你實際上是在尋找什麼是A和B的relative complement爲了得到一個相對補行你想要做一個antijoin:
SELECT * FROM TableA EXCEPT SELECT * FROM TableB.
非常感謝你,這真的是內容豐富的東西!有一個問題,但你的反加入聲明是基於表的PrimaryKeys正確的?我的意思是,他們自動使用PrimaryKeys來做他們的東西,對吧? – 2009-09-16 02:03:42
否 - 比較所有列。它只會篩選表A中存在的表B中也存在的完整行。 – tvanfosson 2009-09-16 02:05:25
SELECT ColumnA, ColumnB
FROM TableA
EXCEPT
SELECT ColumnA, ColumnB
FROM TableB
您可以使用EXISTS子句
SELECT * FROM TableA
WHERE NOT Exists
(
SELECT Column1 FROM TableB
WHERE TableA.Column1 = Table2.Column1
AND TableA.Column2 = Table2.Column2
....
)
更換....同列的兩個表中的其餘部分。
這是更好的答案。在SQL Server中,NOT IN/NOT EXISTS優於LEFT JOIN,因爲它的優化器無法辨別LEFT JOIN/IS NULL中的ANTI JOIN。它將始終返回所有NULLS並將其過濾掉。 – 2009-09-16 02:05:00
或NOT IN
SELECT *
FROM TableA
WHERE TableA.Id NOT IN (SELECT TableB.Id FROM TableB)
我得到使用表A錯誤。*,我的SQL Server Express 2008年。我該怎麼辦? – 2009-09-16 01:54:27
你可以枚舉你想要的列。例如選擇TableA.id,TableA.otherColumn等 – joeslice 2009-09-16 01:55:28
固定它使用此: SELECT * FROM ProductoA LEFT OUTER JOIN ProductoB 上ProductoB.Descripcion = ProductoA.Descripcion 其中ProductoB.Descripcion爲空; – 2009-09-16 01:56:50