Fla*_*ash 9 sql performance distinct notin
我需要返回的所有值从colA不在colB的mytable.我在用:
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)
Run Code Online (Sandbox Code Playgroud)
它正在运行,但查询需要花费很长时间才能完成.
有没有更有效的方法来做到这一点?
Erw*_*ter 17
在标准SQL有没有括号在DISTINCT colA.DISTINCT不是一个功能.
SELECT DISTINCT colA
FROM mytable
WHERE colA NOT IN (SELECT DISTINCT colB FROM mytable);
Run Code Online (Sandbox Code Playgroud)
也添加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;
Run Code Online (Sandbox Code Playgroud)
或者,进一步简化,并使用普通子查询(可能最快):
SELECT DISTINCT m.colA
FROM mytable m
LEFT JOIN mytable x ON x.colB = m.colA
WHERE x.colB IS NULL;
Run Code Online (Sandbox Code Playgroud)
有基本上4种技术来排除与另一本键(或相同)的表中的行:
速度的决定因素是指数.您需要为此查询启用索引colA并colB使其快速.
你可以使用exists:
select distinct
colA
from
mytable m1
where
not exists (select 1 from mytable m2 where m2.colB = m1.colA)
Run Code Online (Sandbox Code Playgroud)
exists进行半连接以快速匹配值.not in完成整个结果集,然后or对其进行处理.exists表格中的值通常更快.