首页 > 解决方案 > 查找值 X 未出现在 Y 列中的记录的最有效方法是什么?

问题描述

我有一个带有行的 SQL 表,每行(除其他外)有两列相关。基本上,想想这样的结构:

A | B    | Data
--|------|-----
1 | NULL | ...
2 | 1    | ...
3 | 2    | ...

如您所见, column 中的某些值A存在于 column 中B,但不是全部:对于A=3没有具有B=的行3

该结构的特点是每个值都只出现一次AB基本上结构如下图:每条记录“指向”另一条记录的ID,所以这基本上是一个链表。

我现在想要的是A在任何其他列中找到其列值没有匹配值的B行。

在给定的演示表中,此查询应返回带有A=的记录3

如果表中只有一行,我希望得到这一行作为结果,尽管不存在引用。

如果表中没有行,则查询应返回NULL.

我已经尝试过使用SELECT … WHERE NOT IN,但这不适NULL用于所需的值。我也试过SELECT … WHERE NOT EXISTS:这没有NULL问题,但对于大表来说它超级慢。

所以我的问题是:有没有一种有效的方法来找到我正在寻找的行,如果有,这个查询是什么样的?

PS:我不是要求特定的数据库,所以基本上SQL标准就可以了。如果对于特定的知名数据库(例如 MariaDB、PostgreSQL、SQL Server ……)有一个非常好的解决方案,我也会对它们的特定解决方案感兴趣,但一般来说,我正在寻找一种通用的方法来解决这个问题。

标签: sqlperformancelinked-list

解决方案


也许这个?

SELECT
    x.*
FROM
    tbl AS x
    LEFT OUTER JOIN tbl AS y ON x.A = y.B
WHERE
    x.A IS NULL

此查询的“效率”取决于您在表上拥有的索引,而不是查询本身。请记住,SQL 查询不会告诉 RDBMS如何完成工作。


推荐阅读