Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

UNION

UNION можно использовать, явно указывая UNION ALL или UNION DISTINCT.

Если не указать ALL или DISTINCT, поведение будет зависеть от настройки union_default_mode. Разница между UNION ALL и UNION DISTINCT заключается в том, что UNION DISTINCT удаляет дубликаты в результате объединения; это эквивалентно SELECT DISTINCT из подзапроса, содержащего UNION ALL.

UNION можно использовать для объединения любого количества запросов SELECT, дополняя их результаты. Пример:

Querysql
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). Если имена столбцов не совпадают, имена итогового результата берутся из первого запроса.

Для UNION выполняется приведение типов. Например, если у двух объединяемых запросов есть одно и то же поле с типами non-Nullable и Nullable совместимого типа, то в результирующем UNION это поле будет иметь тип Nullable.

Запросы, являющиеся частями UNION, могут быть заключены в (). ORDER BY и LIMIT применяются к отдельным запросам, а не к итоговому результату. Если вам нужно применить преобразование к итоговому результату, вы можете поместить все запросы с UNION в подзапрос в предложении FROM.

Если вы используете UNION без явного указания UNION ALL или UNION DISTINCT, вы можете задать режим union с помощью настройки union_default_mode. Значениями настройки могут быть ALL, DISTINCT или пустая строка. Однако если использовать UNION, когда для настройки union_default_mode задана пустая строка, будет сгенерировано исключение. Следующие примеры демонстрируют результаты запросов при разных значениях этой настройки.

Querysql
SET union_default_mode = 'DISTINCT';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
Responsetext
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘
Querysql
SET union_default_mode = 'ALL';
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 2;
Responsetext
┌─1─┐
│ 1 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 2 │
└───┘
┌─1─┐
│ 3 │
└───┘

Запросы в составе UNION/UNION ALL/UNION DISTINCT могут выполняться одновременно, а их результаты — смешиваться.

См. также

Синтаксис

SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]

Часть: SELECT

Navigation