sql - 查找值 X 未出现在 Y 列中的记录的最有效方法是什么?
问题描述
我有一个带有行的 SQL 表,每行(除其他外)有两列相关。基本上,想想这样的结构:
A | B | Data
--|------|-----
1 | NULL | ...
2 | 1 | ...
3 | 2 | ...
如您所见, column 中的某些值A
存在于 column 中B
,但不是全部:对于A
=3
没有具有B
=的行3
。
该结构的特点是每个值都只出现一次A
,B
基本上结构如下图:每条记录“指向”另一条记录的ID,所以这基本上是一个链表。
我现在想要的是A
在任何其他列中找到其列值没有匹配值的B
行。
在给定的演示表中,此查询应返回带有A
=的记录3
。
如果表中只有一行,我希望得到这一行作为结果,尽管不存在引用。
如果表中没有行,则查询应返回NULL
.
我已经尝试过使用SELECT … WHERE NOT IN
,但这不适NULL
用于所需的值。我也试过SELECT … WHERE NOT EXISTS
:这没有NULL
问题,但对于大表来说它超级慢。
所以我的问题是:有没有一种有效的方法来找到我正在寻找的行,如果有,这个查询是什么样的?
PS:我不是要求特定的数据库,所以基本上SQL标准就可以了。如果对于特定的知名数据库(例如 MariaDB、PostgreSQL、SQL Server ……)有一个非常好的解决方案,我也会对它们的特定解决方案感兴趣,但一般来说,我正在寻找一种通用的方法来解决这个问题。
解决方案
也许这个?
SELECT
x.*
FROM
tbl AS x
LEFT OUTER JOIN tbl AS y ON x.A = y.B
WHERE
x.A IS NULL
此查询的“效率”取决于您在表上拥有的索引,而不是查询本身。请记住,SQL 查询不会告诉 RDBMS如何完成工作。