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

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使其快速.


Eri*_*ric 6

你可以使用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表格中的值通常更快.