只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]
Posted
技术标签:
【中文标题】只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]【英文标题】:Retrive Records Form One Table as long as they do not exist in Another table T-SQL [duplicate] 【发布时间】:2008-11-11 12:39:11 【问题描述】:可能重复:What's the difference between NOT EXISTS vs. NOT IN vs. LEFT JOIN WHERE IS NULL?
我需要编写一个查询,该查询将从表 A 中检索记录,前提是表 A 中的键在表 B 中不存在。
任何帮助将不胜感激。
谢谢
【问题讨论】:
请参阅***.com/questions/2246772/… 了解所有列出的选项和性能影响 【参考方案1】:select a.*
from
tableA a
left join tableB b
ON a.id = b.id
where
b.id is null
【讨论】:
+1 - 根据来自 Microsoft 的权力,至少在 SQL Server 2000 上,外部联接比 in 或不存在的地方快。我不知道这在 SQL Server 上是否已经改变2005. +1 - 虽然我认为接受的答案更容易思考,但根据我的经验,事实证明,对于大数据量,此 SQL 的速度要快得多。【参考方案2】:SELECT *
FROM A
WHERE ID NOT IN
(SELECT ID FROM B)
【讨论】:
请注意,这在大数据量上可能会很慢,下面 kristof 描述的解决方案更有效。【参考方案3】:如果键包含多列,则上述解决方案均无效。
如果表具有复合主键,则必须使用类似于下面的“NOT EXISTS”子句。
SELECT *
FROM TableA AS a
WHERE NOT EXISTS (
SELECT *
FROM TableB b
WHERE b.id1 = a.id1
AND b.id2 = a.id2
AND b.id3 = a.id3
);
【讨论】:
+1 这个结构最匹配问题中使用的自然语言。【参考方案4】:使用左连接。数据库尝试使用 id 字段将数据集从 TableB 映射到 TableA。如果 TableB 中没有可用的拟合数据集,则 TableB 数据为 NULL。现在您只需检查 TableB.id 是否为 NULL。
SELECT TableA.* FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id WHERE TableB.id IS NULL
【讨论】:
【参考方案5】:假设: TableA 的 Id = Id TableB的Id = Id
select * from TableA ta where ta.Id not in (select Id from TableB)
【讨论】:
【参考方案6】:SELECT * FROM TableA
WHERE NOT Exists(SELECT * FROM TableB WHERE id=TableA.id)
也可以,而且几乎可以自我记录......
【讨论】:
以上是关于只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 从一个表中获取不存在于另一个表中的记录,并附加了 where 子句