![](/img/trans.png)
[英]SQL - Is it possible to select all Distinct Values from one column where all values from another column match?
[英]Efficient way to select all values from one column not in another column
我需要返回从所有价值colA
不在colB
从mytable
。 我在用:
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种技术可以排除具有另一个(或相同)表中的键的行:
速度的决定因素是指数 。 您需要在colA
和colB
上具有索引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
通常更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.