跳至主要内容
跳至主要内容

UNION 子句

你可以使用 UNION 并显式指定 UNION ALLUNION DISTINCT

如果不指定 ALLDISTINCT,则取决于 union_default_mode 设置。 UNION ALLUNION 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 内部的顺序)匹配。如果列名不匹配,则最终结果的名称将从第一个查询中获取。

对于联合操作,将执行类型转换。例如,如果两个正在组合的查询在兼容类型中具有相同字段,且具有非 NullableNullable 类型,则结果 UNION 具有 Nullable 类型字段。

UNION 的组成部分查询可以包含在圆括号中。 ORDER BYLIMIT 应用于单独的查询,而不应用于最终结果。 如果需要将转换应用于最终结果,可以将包含 UNION 的所有查询放在 FROM 子句中的子查询中。

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

参见

    © . This site is unofficial and not affiliated with ClickHouse, Inc.