我需要从 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
这个查询要快。
关于sql - 从一列而不是另一列中选择所有值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737079/