Sql 查找值X不在列Y中的记录的最有效方法是什么?
我有一个包含行的SQL表,每行有(除其他外)两个相关列。基本上,想象一下这样的结构: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列中没有匹配值的行
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
值的方式不起作用