sql - 从一列而不是另一列中选择所有值的有效方法

标签 sql performance distinct notin

我需要从 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 种技术 排除另一个(或同一个)表中存在键的行:
  • Select rows which are not present in other table

  • 速度的决定因素将是 索引 .您需要在 colA 上建立索引和 colB这个查询要快。

    关于sql - 从一列而不是另一列中选择所有值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8737079/

    相关文章:

    sql - 为什么带有 NULL 列的 count( distinct ) 在 Hive SQL 中返回 0?

    sql - 在几行中增加唯一值

    performance - LinFu IoC 高流量网站最佳实践

    MySQL时间戳自动更新性能

    python - Django 渲染字典性能

    mysql - 如何在MySQL数据库管理系统中的多列上使用 "SQL SELECT DISTINCT Statement"?

    sql-server-2005 - SQL Server选择不同的最新值

    c# - 查找两个多边形之间的最短距离(SqlGeography c#)

    mysql - SQL "group by"仅返回第一行 - 之二

    sql - UPPER 和 to_char 函数未定义