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 部分的查询可以同时运行,并且它们的结果可以混合在一起。
参见