我有一个包含行的SQL表,每行都有(除其他外(两列是相关的。基本上,可以这样考虑结构:
A | B | Data
--|------|-----
1 | NULL | ...
2 | 1 | ...
3 | 2 | ...
如您所见,列中的某些值A
存在于第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如何完成工作。
您可以使用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