假设我有以下数据
+-------+---------+
| 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
中获取,因此如果需要在较小的表上进行一些额外的操作,那很好。
无论你做什么,查询都必然会进行表扫描。它必须检查每一行以确保找到所有不同的值。
更快获取值的更好方法是创建一个查找表,每个不同值只有一行。查询查找表将是最有效的(您可能仍然有数百万个不同的值,但这比查询具有重复出现值的 3 亿行表更好)。
顺便说一下,
DISTINCT
不是一个可以放在一列上的函数。它是一个查询修饰符,它必须遵循 SELECT
。它适用于整行,而不仅仅是一列。
SELECT DISTINCT 'col1' AS `column`, col1 AS value FROM db
UNION ALL
SELECT DISTINCT 'col2', col2 FROM db
column
是保留关键字,因此必须对其进行分隔才能将其用作标识符。
一组 UNION 查询中的第一个查询确定列别名。第一个查询之后的后续查询中定义的别名将被忽略。