从一个表返回与另一表不匹配的单行
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 的回答这样的相关子查询?是的,相关子查询通常比连接慢很多。 是的。这基本上就是我正在做的,但更复杂。这是令人难以置信的缓慢。再次感谢您的帮助。以上是关于从一个表返回与另一表不匹配的单行的主要内容,如果未能解决你的问题,请参考以下文章