从一列而不是另一列中选择所有值的有效方法

问题描述 投票:0回答:3

我需要返回

colA
中不在
colB
中的所有值。我正在使用:

mytable

它正在工作,但是查询需要很长时间才能完成。

有更有效的方法吗?

sql performance distinct notin
3个回答
28
投票
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)

中没有括号。 DISTINCT colA

 不是函数。
DISTINCT

还将
SELECT DISTINCT colA
FROM   mytable
WHERE  colA NOT IN (SELECT DISTINCT colB FROM mytable);
添加到子选择中。对于

many

重复项,它可以加快查询速度。但是,通常有比 
DISTINCT 更有效的查询技术:

选择其他表中不存在的行
  • 速度的决定因素将是
  • 索引
。您需要在

NOT INcolA

 上建立索引才能快速查询。
CTE 可能会更快,具体取决于您的 DBMS。我还演示了 
colB

作为排除

LEFT JOIN

 中的值的替代方法,以及使用 
valB
 获取不同值的替代方法:
GROUP BY

或者,进一步简化,并使用简单的子查询(可能是最快的):
WITH x AS (SELECT colB FROM mytable GROUP BY colB)
SELECT m.colA
FROM   mytable m
LEFT   JOIN x ON x.colB = m.colA
WHERE  x.colB IS NULL
GROUP  BY m.colA;

您可以使用

6
投票

exists

select distinct
    colA
from
    mytable m1
where
    not exists (select 1 from mytable m2 where m2.colB = m1.colA)
进行半连接以快速匹配值。

exists

 完成整个结果集,然后对其执行 
not in
or
 对于表中的值通常更快。

您可以使用

0
投票
exists

运算符来有效区分两个

EXCEPT
查询。 SELECT
 将仅返回唯一值。 Oracle 的 
EXCEPT DISTINCT
运算符相当于
MINUS

© www.soinside.com 2019 - 2024. All rights reserved.