在表X的列A中查找那些在表Y的列B中不存在的值的SQL查询。

3

编写SQL查询,查找表X中列A中不在表Y的列B中出现的值。

更新:使用not in(超过5分钟,我没有等待其完成),表Y中的列B是主键。

更新:我正在使用Oracle。两个表的大小均为数百万行。当然,我还在使用另一个WHERE子句,这意味着我要将表X的约500,000行与表Y中数百万行进行比较。


1
我不会将其关闭为“不是一个真正的问题”。也许是另一个问题的副本,但这是一个有效的问题... - gbn
嗨,Shishir,你使用的是哪个版本的SQL(Oracle、SQLServer、MYSQL等),表B大约有多少行?不同版本的SQL可能会从执行相同查询的不同方式中获得最佳性能;这也可能取决于表的大小。(表扫描与索引扫描。) - user359040
在表X的A列上有索引吗? - Martin Smith
是的,该列是两个索引的一部分,这两个索引还包含其他两列。 - sgarg
@shishir - 这篇文章认为使用MINUS将会给你更好的性能表现。http://www.dba-oracle.com/oracle_tips_subq_rewrite.htm - Martin Smith
@martin。没错,减法运算很好用!谢谢。 - sgarg
3个回答

7

如果Y.B中有任何NULL值,您就不能依赖于NOT IN

Select A from X where not EXISTS (select * from Y where Y.B = X.A)

一般来说,最安全的方式是使用NOT EXISTS。如果Y是A的子项,则OUTER JOIN可能会给出更多行。


2
我能想到4种方法来实现这个功能:
  • 使用Not In(注意空值)
  • 使用OUTER JOIN并过滤空值(可能需要添加DISTINCT关键字)
  • 使用NOT EXISTS
  • 使用EXCEPT(根据问题更新,Oracle使用非标准运算符MINUS来实现此功能)

最后一种方法似乎是在Oracle中实现这个功能的首选方式,但我自己无法保证。


1
需要注意的是,在使用 OUTER JOIN 时可能需要加上 DISTINCT 关键词...? - gbn
2
注意:EXCEPT 仅适用于 SQL Server 2005 及以上版本。 - Neil Knight
1
@Ardman 除了这个,EXCEPT 在标准 SQL 中也是常见的。OP 没有指定任何特定的版本。快速搜索显示它在 Sybase http://dcx.sybase.com/1100en/dbusage_en11/set-operations-sorting.html 和 PostgreSQL SQL http://www.postgresql.org/files/documentation/books/aw_pgsql/node80.html 中都得到支持。 - Martin Smith

0
这应该能行:
Select A from X where not A in (select B from Y)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接