我需要返回
colA
中不在 colB
中的所有值。我正在使用:mytable
它正在工作,但是查询需要很长时间才能完成。
有更有效的方法吗?
SELECT DISTINCT(colA) FROM mytable WHERE colA NOT IN (SELECT colB FROM mytable)
中没有括号。 DISTINCT colA
不是函数。
DISTINCT
还将 SELECT DISTINCT colA
FROM mytable
WHERE colA NOT IN (SELECT DISTINCT colB FROM mytable);
添加到子选择中。对于many
重复项,它可以加快查询速度。但是,通常有比
DISTINCT
更有效的查询技术:
选择其他表中不存在的行。您需要在 NOT IN
和 colA
上建立索引才能快速查询。
CTE 可能会更快,具体取决于您的 DBMS。我还演示了
colB
作为排除 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;
您可以使用
exists
select distinct
colA
from
mytable m1
where
not exists (select 1 from mytable m2 where m2.colB = m1.colA)
进行半连接以快速匹配值。 exists
完成整个结果集,然后对其执行
not in
。
or
对于表中的值通常更快。您可以使用