首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于查找ID不在另一个表中的记录的SQL查询

用于查找ID不在另一个表中的记录的SQL查询
EN

Stack Overflow用户
提问于 2012-08-21 12:57:13
回答 6查看 270K关注 0票数 156

我在数据库中有两个具有绑定主键的表,我希望在它们之间找到一个不相交的集合。例如,

  • Table1有列(ID, Address)和样本数据:(1, address2), (2, address2)

有列(ID, Name)和样本数据

那么,如何创建一个SQL查询,以便可以从不在table2中的table1中提取ID为的行。在这种情况下,应该返回(3, Mary)吗?

PS: ID是这两个表的主键。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-21 13:01:19

尝尝这个

代码语言:javascript
复制
SELECT ID, Name 
FROM   Table1 
WHERE  ID NOT IN (SELECT ID FROM Table2)
票数 254
EN

Stack Overflow用户

发布于 2012-08-21 13:00:51

使用LEFT JOIN

代码语言:javascript
复制
SELECT  a.*
FROM    table1 a
            LEFT JOIN table2 b
                on a.ID = b.ID
WHERE   b.id IS NULL
票数 124
EN

Stack Overflow用户

发布于 2019-04-05 07:47:24

基本上有3种方法:not existsnot inleft join / is null

左联接值为空

代码语言:javascript
复制
SELECT  l.*
FROM    t_left l
LEFT JOIN
        t_right r
ON      r.value = l.value
WHERE   r.value IS NULL

不在

代码语言:javascript
复制
SELECT  l.*
FROM    t_left l
WHERE   l.value NOT IN
        (
        SELECT  value
        FROM    t_right r
        )

不存在

代码语言:javascript
复制
SELECT  l.*
FROM    t_left l
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    t_right r
        WHERE   r.value = l.value
        )

哪一个更好?这个问题的答案可能更好地分解到主要的特定RDBMS供应商。一般来说,当子查询中的记录数量未知时,应该避免使用select ... where ... in (select...)。一些供应商可能会限制大小。例如,甲骨文就有一个limit of 1,000。最好的做法是尝试所有这三种方法,并显示执行计划。

具体到PostgreSQL中,NOT EXISTSLEFT JOIN / IS NULL的执行计划是相同的。我个人更喜欢NOT EXISTS选项,因为它显示了更好的意图。毕竟,语义是您希望在A中查找其pk 在B中不存在的记录。

历史悠久但仍是金色的,虽然是PostgreSQL特有的:https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12048633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档