# Объединение результатов подзапросов (UNION) ## UNION {#union} Объединение результатов нескольких подзапросов с удалением дубликатов. Поведение идентично последовательному исполнению `UNION ALL` и `SELECT DISTINCT *`. См. [UNION ALL](#union-all) для информации о деталях поведения. ### Примеры ```yql SELECT key FROM T1 UNION SELECT key FROM T2 -- возвращает таблицу различных ключей, лежащих хотя бы в одной из исходных таблиц ``` ## UNION ALL {#union-all} Конкатенация результатов нескольких `SELECT` (или подзапросов). Поддерживаются два режима выполнения `UNION ALL` – по именам колонок (режим по умолчанию) и по позициям колонок (соответствует стандарту ANSI SQL и включается через соответствующую [PRAGMA](../pragma.md#positionalunionall)). В режиме "по именам" результирующая схема данных выводится по следующим правилам: * в результирующую таблицу включаются все колонки, которые встречались хоть в одной из входных таблиц; * если колонка присутствовала не во всех входных таблицах, то ей автоматически присваивается [опциональный тип данных](../../types/optional.md) (допускающий значение `NULL`); * если колонка в разных входных таблицах имела разные типы, то выводится общий тип (наиболее широкий); * если колонка в разных входных таблицах имела разнородный тип, например строку и число, то это считается ошибкой. Порядок выходных колонок в этом режиме выводится как наибольший общий префикс порядка входов, после чего следуют все остальные колонки в алфавитном порядке. Если наибольший общий префикс пуст (в том числе и из-за отсутствия порядка на одном из входов), то порядок выхода не определен. В режиме "по позициям" результирующая схема данных выводится по следующим правилам: * число колонок во всех входах должно быть одинаковым * порядок колонок во всех входах должен быть определен * имена результирующих колонок совпадают с именами колонок первой таблицы * тип результирующих колонок выводится как общий (наиболее широкий) тип из типов входных колонок стоящих на одинаковых позициях Порядок выходных колонок в этом режиме совпадает с порядком колонок первого входа. ### Примеры ```yql SELECT 1 AS x UNION ALL SELECT 2 AS y UNION ALL SELECT 3 AS z; ``` В результате выполнения данного запроса в режиме по-умолчанию будет сформирована выборка с тремя колонками x, y, и z. При включенной `PRAGMA PositionalUnionAll;` в выборке будет одна колонка x. ```yql PRAGMA PositionalUnionAll; SELECT 1 AS x, 2 as y UNION ALL SELECT * FROM AS_TABLE([<|x:3, y:4|>]); -- ошибка: порядок колонок в AS_TABLE не определен ``` ```yql SELECT * FROM T1 UNION ALL (SELECT * FROM T2 ORDER BY key LIMIT 100); -- при отсутствии скобок ORDER BY/LIMIT применится к результату всего UNION ALL ```