Skip to main content

Секция UNION

Вы можете использовать UNION в двух режимах: UNION ALL или UNION DISTINCT.

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

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

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, выполняются параллельно, и их результаты могут быть смешаны вместе.

Смотрите также