从一个表返回与另一表不匹配的单行

Posted

技术标签:

【中文标题】从一个表返回与另一表不匹配的单行【英文标题】:return single rows from one table that don't match other table 【发布时间】:2014-05-18 00:48:54 【问题描述】:

所以我有两张桌子。我正在尝试加入两个表,并且只返回表 a 中在表 b 中没有匹配项的记录。到目前为止我很难过。

表 A

--------------------
name amount     date
--------------------
bob     250 4/8/2010
dan     100 4/8/2010
sla     222 4/8/2010
obo     344 4/8/2010
bob     100 4/8/2010

表 B

--------------------
name amount     date
--------------------
bob     250 4/8/2010
dan     100 4/8/2010
sla     500 4/8/2010
obo     300 4/8/2010
bob     100 4/8/2010

【问题讨论】:

取决于你的 sql 版本,MINUS 【参考方案1】:

你可以使用EXISTS

SELECT * 
FROM a 
WHERE NOT EXISTS (SELECT * 
                  FROM b 
                  WHERE name = a.name 
                    AND amount = a.amount 
                    AND date = a.date)

【讨论】:

【参考方案2】:

在 SQL 中执行此操作的规范方法之一是使用 outer join:

select a.*
from a left outer join b
on (
  a."name" = b."name"
  and a."amount" = b."amount"
  and a."date" = b."date"
) where b."name" is null
and b."amount" is null
and b."date" is null

左外连接返回连接左侧表中的所有行,无论它们是否匹配连接右侧表中的行。但是当左表中的行在右表中没有匹配时,右表的列设置为null。因此,您可以过滤掉所有 匹配的行,并仅返回左侧表中 匹配的行。

【讨论】:

这正是我想要的。这比我之前使用多项选择的方式快得多。 @morgan - 你的意思是像 Notulysses 的回答这样的相关子查询?是的,相关子查询通常比连接慢很多。 是的。这基本上就是我正在做的,但更复杂。这是令人难以置信的缓慢。再次感谢您的帮助。

以上是关于从一个表返回与另一表不匹配的单行的主要内容,如果未能解决你的问题,请参考以下文章

计算一个表中与另一表中的条件匹配的记录

将三行与另一表中的一行连接起来

将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较

如何在一个表中显示多行,另一表中的一行显示为单行

SQL连接查询

从一个表中选择所有元素,并检查它们是不是与另一个表匹配