只要它们不存在于另一个表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 子句

在一个表中查找不存在于另一个表中的ID

php 选择值(不存在于另一个表中)

SQL Server 查询。用户存在于另一个表中但不存在用户的位置

删除一个表中存在而另一个表中不存在的数据?

如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号