跳到主要内容
跳到主要内容

UNION 子句

您可以显式指定 UNION ALLUNION DISTINCT 来使用 UNION

如果您未指定 ALLDISTINCT,则将取决于 union_default_mode 设置。UNION ALLUNION 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 BYLIMIT 应用于单独的查询,而不是最终结果。如果您需要对最终结果应用转换,可以将所有带有 UNION 的查询放在 FROM 子句的子查询中。

如果您使用 UNION 而未显式指定 UNION ALLUNION DISTINCT,则可以使用 union_default_mode 设置来指定联合模式。设置值可以是 ALLDISTINCT 或空字符串。但是,如果您将 UNIONunion_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 部分的查询可以同时运行,并且它们的结果可以混合在一起。

参见