跳到主要内容

UNION 语句

您可以使用 `UNION` 并显式指定 `UNION ALL` 或 `UNION DISTINCT`。

如果您没有指定 `ALL` 或 `DISTINCT`,它将取决于 `union_default_mode` 设置。 `UNION ALL` 和 `UNION DISTINCT` 之间的区别在于 `UNION 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 应用于单独的查询,而不是最终结果。 如果您需要对最终结果应用转换,您可以在 FROM 子句中将所有带有 `UNION` 的查询放在子查询中。

如果您使用 `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` 部分的查询可以同时运行,并且其结果可以混合在一起。

另请参阅