2009-09-16 61 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)