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

Sql 查找值X不在列Y中的记录的最有效方法是什么?,sql,performance,linked-list,Sql,Performance,Linked List,我有一个包含行的SQL表,每行有(除其他外)两个相关列。基本上,想象一下这样的结构: A | B | Data --|------|----- 1 | NULL | ... 2 | 1 | ... 3 | 2 | ... 如您所见,列A中的一些值存在于列B中,但并非全部:对于A=3,没有包含B=3的行 该结构的特点是A和B中的每个值只发生一次,基本结构如图所示:每个记录“指向”另一个记录的ID,因此这基本上是一个链表 我现在要做的是查找其列A值在任何其他B列中没有匹配值的行

我有一个包含行的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如何工作。

也许是这样

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

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

您可以使用
不在
中:

select
    a
  from my_table
  where a not in (select b from my_table)
您还可以使用
减号
(Oracle):


您可以在
中使用

select
    a
  from my_table
  where a not in (select b from my_table)
您还可以使用
减号
(Oracle):


通用的解决方案是基于不存在的数据库管理系统,它是超慢的?有哪些索引?一般的解决方案是基于不存在的,在哪个DBMS上超慢?确实存在哪些索引?感谢Oracle特定的解决方案,但带有
不在
的通用版本正是我编写的,因为
不在
处理
空值的方式不起作用,感谢Oracle特定的解决方案,但是
NOT IN
的通用版本正是我所写的,因为
NOT IN
处理
NULL
值的方式不起作用