在 ClickHouse 中,UNION
用于合并两个或多个查询的结果集。ClickHouse 默认支持的是 UNION ALL
,即合并结果集时不去重。如果需要使用 UNION DISTINCT
(即合并结果集时去重),可以显式地指定。
UNION ALL
UNION ALL
不去重,直接合并结果集。
sql
SELECT id, name FROM table1
UNION ALL
SELECT id, name FROM table2;
UNION DISTINCT
UNION DISTINCT
会对合并后的结果进行去重。
sql
SELECT id, name FROM table1
UNION DISTINCT
SELECT id, name FROM table2;
示例表结构
假设有两个表 table1
和 table2
,它们的结构如下:
sql
CREATE TABLE table1 (
id UInt32,
name String
) ENGINE = MergeTree()
ORDER BY id;
CREATE TABLE table2 (
id UInt32,
name String
) ENGINE = MergeTree()
ORDER BY id;
使用 UNION ALL 和 UNION DISTINCT 的示例
UNION ALL 示例
合并两个表的所有记录:
sql
SELECT id, name FROM table1
UNION ALL
SELECT id, name FROM table2;
UNION DISTINCT 示例
合并两个表并去重:
sql
SELECT id, name FROM table1
UNION DISTINCT
SELECT id, name FROM table2;
使用 ORDER BY 和 LIMIT
如果需要对合并后的结果进行排序或限制结果集的大小,可以在 UNION
后使用 ORDER BY
和 LIMIT
:
UNION ALL 和 ORDER BY
sql
SELECT id, name FROM table1
UNION ALL
SELECT id, name FROM table2
ORDER BY id;
UNION DISTINCT 和 LIMIT
sql
SELECT id, name FROM table1
UNION DISTINCT
SELECT id, name FROM table2
LIMIT 10;
注意事项
- 列数和数据类型需要一致:每个子查询的列数和数据类型需要保持一致,否则会导致查询失败。
- 性能考虑 :
UNION DISTINCT
需要对结果集去重,因此可能会比UNION ALL
消耗更多的资源。
通过这些示例,你可以在 ClickHouse 中使用 UNION ALL
和 UNION DISTINCT
来合并多个查询的结果集。