在多列上分别选择不同值的最快方法

问题描述 投票:0回答:1

假设我有以下数据

+-------+---------+
| col1  | col2    |
+-------+---------+
|  1    | a       |
|  2    | a       |
|  3    | a       |
|  2    | a       |
|  5    | d       |
|  5    | b       |
+-------+---------+

我想编写一个返回两列、列及其唯一值的查询。因此;

+---------+---------+
| column  | value   |
+---------+---------+
|  col1    | 1      |
|  col1    | 2      |
|  col1    | 3      |
|  col1    | 5      |
|  col2    | a      |
|  col2    | b      |
|  col2    | d      |
+----------+--------+

我可以通过以下查询来实现这一点:

    SELECT 'col1' AS column, DISTINCT(col1) AS value FROM db
UNION ALL
    SELECT 'col2' AS column, DISTINCT(col2) AS value FROM db

它工作正常,但在我的真实数据库中,我有超过 3 亿行和 300 多列。我确实相信所有的

UNION ALL
都会大大减慢这个过程,我想知道是否还有其他方法?聚合结果将在
R/Python
中获取,因此如果需要在较小的表上进行一些额外的操作,那很好。

sql
1个回答
0
投票

无论你做什么,查询都必然会进行表扫描。它必须检查每一行以确保找到所有不同的值。

更快获取值的更好方法是创建一个查找表,每个不同值只有一行。查询查找表将是最有效的(您可能仍然有数百万个不同的值,但这比查询具有重复出现值的 3 亿行表更好)。

顺便说一下,

DISTINCT
不是一个可以放在一列上的函数。它是一个查询修饰符,它必须遵循
SELECT
。它适用于整行,而不仅仅是一列。

SELECT DISTINCT 'col1' AS `column`, col1 AS value FROM db
UNION ALL
SELECT DISTINCT 'col2', col2 FROM db

column
是保留关键字,因此必须对其进行分隔才能将其用作标识符。

一组 UNION 查询中的第一个查询确定列别名。第一个查询之后的后续查询中定义的别名将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.