回答
假设表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