我需要返回colA
中colB
以外的所有值mytable
。我正在使用:
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)
它正在运行,但查询花费的时间过长。
有更有效的方法吗?
答案 0 :(得分:15)
在标准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
上设置索引才能使此查询更快。
答案 1 :(得分: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
。对于表中的值,exists
通常更快。
答案 2 :(得分:0)