当前位置: 首页 > 知识库问答 >
问题:

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

华永新
2023-03-14

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

  • Table1有列(ID,Name)和示例数据:(1,John)、(2,Peter)、(3,Mary)

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

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

共有3个答案

汪典
2023-03-14

基本上有三种方法不存在不在左连接/为空

SELECT  l.*
FROM    t_left l
LEFT JOIN
        t_right r
ON      r.value = l.value
WHERE   r.value IS NULL
SELECT  l.*
FROM    t_left l
WHERE   l.value NOT IN
        (
        SELECT  value
        FROM    t_right r
        )
SELECT  l.*
FROM    t_left l
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    t_right r
        WHERE   r.value = l.value
        )

哪一个更好?这个问题的答案最好分解为主要的特定RDBMS供应商。一般来说,应该避免使用select。。。哪里在(选择…) 子查询中记录数的大小未知时。一些供应商可能会限制尺寸。例如,甲骨文的限制是1000。最好的办法是尝试这三种方法,并展示执行计划。

具体形式为PostgreSQL,NO 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/

锺高翰
2023-03-14

使用左连接

SELECT  a.*
FROM    table1 a
            LEFT JOIN table2 b
                on a.ID = b.ID
WHERE   b.id IS NULL
姚淳
2023-03-14

试试这个

SELECT ID, Name 
FROM   Table1 
WHERE  ID NOT IN (SELECT ID FROM Table2)
 类似资料:
  • 问题内容: 我有以下两个SQL表(在MySQL中): 如何找出哪些电话是由人,他们提出是不是在?所需的输出将是: 任何帮助将非常感激。 问题答案: 有几种不同的方法可以执行此操作,效率各不相同,具体取决于查询优化器的性能以及两个表的相对大小: 这是最简短的陈述,如果您的电话簿很短,则可能是最快的陈述: 或者(由于Alterlife) 或(感谢WOPR) (如其他人所说,忽略它通常最好只选择想要的列

  • 问题内容: 我有以下两个表(在MySQL中): 如何找出哪些电话是由人,他们提出是不是在?所需的输出将是: 问题答案: 有几种不同的方法可以执行此操作,效率各不相同,具体取决于查询优化器的性能以及两个表的相对大小: 这是最简短的陈述,如果您的电话簿很短,则可能是最快的陈述: 或(感谢WOPR) (忽略这一点,正如其他人所说的那样,通常最好只选择所需的列,而不是’ ‘)

  • 问题内容: 主题表 SubjectToClass表 我需要列出的所有行,其中的表是不是在指定类的表。 我有这个但不能再走了 问题答案:

  • 我有两张桌子: 我需要从表1中选择记录,其中Value1或Value2不同于表1\u中用相同的键1、键2和键3详细描述的值1和/或值2的总和。此外,我还需要表之间的值差,例如,上面我需要查询返回: 我尝试了很多方法来解决这个问题,但我错过了一些东西,我将非常感谢任何帮助。

  • 问题内容: 因为显然每个人都讨厌子选择,所以我想使用联接来做到这一点。 举一个令人难以置信的示例,拿两个表,一个表的列表是1-6的数字,而另一个表的列表是偶数的0-8。然后,我的目标是在表格Nums中输出所有奇数。 如果我只想获取Nums中的偶数列表,我会… 但是,如何使用这些表来获取Nums表中的非偶数列表?或者,换句话说,像… 问题答案: 正确使用SubSELECT可以很好…单独的“某人不喜欢

  • 我有两个表:< code>person_concern和< code>person。它们都有一个< code >代码列,而< code>person有一个< code>dept列。我想从< code>person_concern表中选择数据,其中< code>person表中的< code>dept列= 30。 基本上,表的每一行都有不同的代码,然后将该人员放入一个部门。因此,我可以在表中使用相同