查找值 X 未出现在 Y 列中的记录的最有效方法是什么?



我有一个包含行的SQL表,每行都有(除其他外(两列是相关的。基本上,可以这样考虑结构:

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

如您所见,列中的某些值A存在于第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,...(我也会对它们的具体解决方案感兴趣,但总的来说,我正在寻找解决此问题的通用方法。

也许是这个?

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

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

您可以使用NOT IN

select
a
from my_table
where a not in (select b from my_table)

您还可以使用MINUS(Oracle(:

select a from my_table
minus
select b from my_table

相关内容

  • 没有找到相关文章

最新更新