2009-09-16 59 views

回答

6

假設表A和表B具有名稱ID的主鍵。

select TableA.* 
    from TableA 
left outer join TableB on TableB.id = TableA.id 
where TableB.id is null; 

這將查找表b沒有表a的id實例的所有條目。

+0

我得到使用表A錯誤。*,我的SQL Server Express 2008年。我該怎麼辦? – 2009-09-16 01:54:27

+0

你可以枚舉你想要的列。例如選擇TableA.id,TableA.otherColumn等 – joeslice 2009-09-16 01:55:28

+0

固定它使用此: SELECT * FROM ProductoA LEFT OUTER JOIN ProductoB 上ProductoB.Descripcion = ProductoA.Descripcion 其中ProductoB.Descripcion爲空; – 2009-09-16 01:56:50

2

你有你的術語錯誤。該intersection將是在這兩個表A和B表,你實際上是在尋找什麼是A和B的relative complement爲了得到一個相對補行你想要做一個antijoin

SELECT * FROM TableA EXCEPT SELECT * FROM TableB. 
+0

非常感謝你,這真的是內容豐富的東西!有一個問題,但你的反加入聲明是基於表的PrimaryKeys正確的?我的意思是,他們自動使用PrimaryKeys來做他們的東西,對吧? – 2009-09-16 02:03:42

+0

否 - 比較所有列。它只會篩選表A中存在的表B中也存在的完整行。 – tvanfosson 2009-09-16 02:05:25

2
SELECT ColumnA, ColumnB 
FROM TableA 
EXCEPT 
SELECT ColumnA, ColumnB 
FROM TableB 
4

您可以使用EXISTS子句

SELECT * FROM TableA 
WHERE NOT Exists 
(
SELECT Column1 FROM TableB 
WHERE TableA.Column1 = Table2.Column1 
AND TableA.Column2 = Table2.Column2 
.... 
) 

更換....同列的兩個表中的其餘部分。

+0

這是更好的答案。在SQL Server中,NOT IN/NOT EXISTS優於LEFT JOIN,因爲它的優化器無法辨別LEFT JOIN/IS NULL中的ANTI JOIN。它將始終返回所有NULLS並將其過濾掉。 – 2009-09-16 02:05:00

1

或NOT IN

SELECT * 
FROM TableA 
WHERE TableA.Id NOT IN (SELECT TableB.Id FROM TableB)