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