UNION 子句
您可以显式指定 UNION ALL
或 UNION DISTINCT
来使用 UNION
。
如果您未指定 ALL
或 DISTINCT
,则将取决于 union_default_mode
设置。UNION ALL
和 UNION DISTINCT
之间的区别在于 UNION DISTINCT
将对联合结果执行 distinct 转换,它等效于从包含 UNION ALL
的子查询中执行 SELECT DISTINCT
。
您可以使用 UNION
通过扩展 SELECT
查询的结果来合并任意数量的查询。示例
SELECT CounterID, 1 AS table, toInt64(count()) AS c
FROM test.hits
GROUP BY CounterID
UNION ALL
SELECT CounterID, 2 AS table, sum(Sign) AS c
FROM test.visits
GROUP BY CounterID
HAVING c > 0
结果列按其索引(SELECT
内部的顺序)匹配。如果列名不匹配,则最终结果的名称取自第一个查询。
为联合执行类型转换。例如,如果正在合并的两个查询具有相同的字段,但类型分别为兼容类型的非 Nullable
类型和 Nullable
类型,则生成的 UNION
将具有 Nullable
类型字段。
作为 UNION
部分的查询可以括在圆括号中。ORDER BY 和 LIMIT 应用于单独的查询,而不是最终结果。如果您需要对最终结果应用转换,可以将所有带有 UNION
的查询放在 FROM 子句的子查询中。
如果您使用 UNION
而未显式指定 UNION ALL
或 UNION DISTINCT
,则可以使用 union_default_mode 设置来指定联合模式。设置值可以是 ALL
、DISTINCT
或空字符串。但是,如果您将 UNION
与 union_default_mode
设置为空字符串一起使用,则会抛出异常。以下示例演示了使用不同值设置的查询结果。
查询
SET union_default_mode = 'DISTINCT';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
结果
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘
查询
SET union_default_mode = 'ALL';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
结果
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘
作为 UNION/UNION ALL/UNION DISTINCT
部分的查询可以同时运行,并且它们的结果可以混合在一起。
参见