繁体   English   中英

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

[英]Efficient way to select all values from one column not in another column

我需要返回从所有价值colA不在colBmytable 我在用:

SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)

它正在运行,但查询需要花费很长时间才能完成。

有没有更有效的方法来做到这一点?

在标准SQL DISTINCT colA没有括号 DISTINCT不是一个功能。

SELECT DISTINCT colA
FROM   mytable
WHERE  colA NOT IN (SELECT DISTINCT colB FROM mytable);

也将DISTINCT添加到子选择中。 如果您有许多重复项,它可以加快查询速度。

CTE可能更快,具体取决于您的DBMS。 我还演示了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;

或者,进一步简化,并使用普通子查询(可能最快):

SELECT DISTINCT m.colA
FROM   mytable m
LEFT   JOIN mytable x ON x.colB = m.colA
WHERE  x.colB IS NULL;

基本上有4种技术可以排除具有另一个(或相同)表中的键的行:

速度的决定因素是指数 您需要在colAcolB上具有索引colB使此查询更快。

你可以使用exists

select distinct
    colA
from
    mytable m1
where
    not exists (select 1 from mytable m2 where m2.colB = m1.colA)

exists执行半连接以快速匹配值。 not in完成整个结果集然后做一个or在上面。 对于表中的值, exists通常更快。

您可以使用EXCEPT运算符来有效地区分两个SELECT查询。 EXCEPT DISTINCT将仅返回唯一值。 Oracle的MINUS运算符相当于EXCEPT DISTINCT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM