我在数据库中有两个带有绑定主键的表,我希望在它们之间找到一个不相交的集。例如
Table1
有列(ID,Name
)和示例数据:(1,John)、(2,Peter)、(3,Mary)
那么,我如何创建一个SQL查询,以便我可以从table1
中获取没有在table2
中的带有ID的行。在这种情况下,(3, Mary)
应该返回吗?
PS:ID是这两个表的主键。
基本上有三种方法:不存在
,不在
和左连接/为空
。
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 EXISTS
和LEFT 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/
使用左连接
SELECT a.*
FROM table1 a
LEFT JOIN table2 b
on a.ID = b.ID
WHERE b.id IS NULL
试试这个
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。 基本上,表的每一行都有不同的代码,然后将该人员放入一个部门。因此,我可以在表中使用相同