diff options
author | robot-piglet <[email protected]> | 2025-07-02 13:40:47 +0300 |
---|---|---|
committer | robot-piglet <[email protected]> | 2025-07-02 13:56:04 +0300 |
commit | 37ea90b963d2b473339da65de917cd881dcd971f (patch) | |
tree | a39324852121be7801f51d923e200feb65e1e0f1 | |
parent | d92bd641fb97e9b3768d08a5b3a98d444d827b2c (diff) |
Intermediate changes
commit_hash:a2f70c63e4943b44671b6f155937a59fea7fc673
-rw-r--r-- | yql/essentials/docs/ru/syntax/expressions.md | 2 | ||||
-rw-r--r-- | yql/essentials/docs/ru/syntax/pragma/global.md | 4 | ||||
-rw-r--r-- | yql/essentials/docs/ru/syntax/select/concat.md | 4 | ||||
-rw-r--r-- | yql/essentials/docs/ru/syntax/select/index.md | 78 | ||||
-rw-r--r-- | yql/essentials/docs/ru/syntax/select/operators.md | 248 | ||||
-rw-r--r-- | yql/essentials/docs/ru/syntax/select/toc_i.yaml | 32 | ||||
-rw-r--r-- | yql/essentials/docs/ru/syntax/select/union.md | 68 |
7 files changed, 335 insertions, 101 deletions
diff --git a/yql/essentials/docs/ru/syntax/expressions.md b/yql/essentials/docs/ru/syntax/expressions.md index 76930efd315..89687484760 100644 --- a/yql/essentials/docs/ru/syntax/expressions.md +++ b/yql/essentials/docs/ru/syntax/expressions.md @@ -439,7 +439,7 @@ $x, $y = AsTuple($y, $x); -- swap значений выражений Здесь табличные выражения работают как ожидается – например `$input = SELECT a, b, c FROM T; SELECT * FROM $input` вернет таблицу с тремя колонками. - Табличный контекст также возникает после [UNION ALL](select/index.md#unionall), [JOIN](join.md#join), [PROCESS](process.md#process), [REDUCE](reduce.md#reduce); + Табличный контекст также возникает после [UNION [ALL]](select/operators.md#union), [INTERSECT [ALL]](select/operators.md#intersect), [EXCEPT [ALL]](select/operators.md#except), [JOIN](join.md#join), [PROCESS](process.md#process), [REDUCE](reduce.md#reduce); * векторный контекст — после [IN](#in). В этом контексте табличное выражение обязано содержать ровно одну колонку (имя этой колонки никак не влияет на результат выражения). diff --git a/yql/essentials/docs/ru/syntax/pragma/global.md b/yql/essentials/docs/ru/syntax/pragma/global.md index 5a36dc9b068..cb6d7c4a152 100644 --- a/yql/essentials/docs/ru/syntax/pragma/global.md +++ b/yql/essentials/docs/ru/syntax/pragma/global.md @@ -181,11 +181,11 @@ SELECT * FROM test; `OrderedColumns` / `DisableOrderedColumns` -Выводить [порядок колонок](../select/index.md#orderedcolumns) в `SELECT`/`JOIN`/`UNION ALL` и сохранять его при записи результатов. По умолчанию порядок колонок не определен. +Выводить [порядок колонок](../select/index.md#orderedcolumns) в `SELECT` / `JOIN` / `UNION [ALL]` / `INTERSECT [ALL]` / `EXCEPT [ALL]` и сохранять его при записи результатов. По умолчанию порядок колонок не определен. ## PositionalUnionAll {#positionalunionall} -Включить соответствующий стандарту поколоночный режим выполнения [UNION ALL](../select/index.md#unionall). При этом автоматически включается [упорядоченность колонок](#orderedcolumns). +Включить соответствующий стандарту поколоночный режим выполнения [UNION [ALL]](../select/operators.md#union), [INTERSECT [ALL]](../select/operators.md#intersect), [EXCEPT [ALL]](../select/operators.md#except). При этом автоматически включается [упорядоченность колонок](#orderedcolumns). ## RegexUseRe2 diff --git a/yql/essentials/docs/ru/syntax/select/concat.md b/yql/essentials/docs/ru/syntax/select/concat.md index c179ba9b70a..2d696808cb8 100644 --- a/yql/essentials/docs/ru/syntax/select/concat.md +++ b/yql/essentials/docs/ru/syntax/select/concat.md @@ -1,6 +1,6 @@ # Обращение к нескольким таблицам в одном запросе -В стандартном SQL для выполнения запроса по нескольким таблицам используется [UNION ALL](../select/union.md#union_all), который объединяет результаты двух и более `SELECT`. Это не совсем удобно для сценария использования, в котором требуется выполнить один и тот же запрос по нескольким таблицам (например, содержащим данные на разные даты). В YQL, чтобы было удобнее, в `SELECT` после `FROM` можно указывать не только одну таблицу или подзапрос, но и вызывать встроенные функции, позволяющие объединять данные нескольких таблиц. +В стандартном SQL для выполнения запроса по нескольким таблицам используется [UNION ALL](../select/operators.md#union-all), который объединяет результаты двух и более `SELECT`. Это не совсем удобно для сценария использования, в котором требуется выполнить один и тот же запрос по нескольким таблицам (например, содержащим данные на разные даты). В YQL, чтобы было удобнее, в `SELECT` после `FROM` можно указывать не только одну таблицу или подзапрос, но и вызывать встроенные функции, позволяющие объединять данные нескольких таблиц. Для этих целей определены следующие функции: @@ -16,7 +16,7 @@ {% endnote %} -По умолчанию схемы всех участвующих таблиц объединяются по правилам [UNION ALL](union.md#union-all). Если объединение схем не желательно, то можно использовать функции с суффиксом `_STRICT`, например `CONCAT_STRICT`, которые работают полностью аналогично оригинальным, но считают любое расхождение в схемах таблиц ошибкой. +По умолчанию схемы всех участвующих таблиц объединяются по правилам [UNION ALL](operators.md#union-all). Если объединение схем не желательно, то можно использовать функции с суффиксом `_STRICT`, например `CONCAT_STRICT`, которые работают полностью аналогично оригинальным, но считают любое расхождение в схемах таблиц ошибкой. Для указания кластера объединяемых таблиц нужно указать его перед названием функции. diff --git a/yql/essentials/docs/ru/syntax/select/index.md b/yql/essentials/docs/ru/syntax/select/index.md index 602b0d3f65f..135214a6880 100644 --- a/yql/essentials/docs/ru/syntax/select/index.md +++ b/yql/essentials/docs/ru/syntax/select/index.md @@ -19,11 +19,11 @@ SELECT 2 + 2; Результат запроса `SELECT` вычисляется следующим образом: -* определяется набор входных таблиц – вычисляются выражения после [FROM](../select/from.md); -* к входным таблицам применяется [SAMPLE](sample.md) / [TABLESAMPLE](sample.md) +* определяется набор входных таблиц – вычисляются выражения после [FROM](from.md); +* к входным таблицам применяется [SAMPLE](sample.md) / [TABLESAMPLE](sample.md); * выполняется [FLATTEN COLUMNS](../flatten.md#flatten-columns) или [FLATTEN BY](../flatten.md); алиасы, заданные во `FLATTEN BY`, становятся видны после этой точки; * выполняются все [JOIN](../join.md); -* к полученным данным добавляются (или заменяются) колонки, заданные в [GROUP BY ... AS ...](../group_by.md) (выполняется после `WHERE` начиная с версии [2025.02](../../changelog/2025.02.md#group-by-expr-alias-where)). +* к полученным данным добавляются (или заменяются) колонки, заданные в [GROUP BY ... AS ...](../group_by.md) (выполняется после `WHERE` начиная с версии [2025.02](../../changelog/2025.02.md#group-by-expr-alias-where)); * выполняется [WHERE](where.md) - все данные не удовлетворяющие предикату отфильтровываются; * выполняется [GROUP BY](../group_by.md), вычисляются значения агрегатных функций; * выполняется фильтрация [HAVING](../group_by.md#having); @@ -31,32 +31,32 @@ SELECT 2 + 2; * вычисляются выражения в `SELECT`; * выражениям в `SELECT` назначаются имена заданные алиасами; * к полученным таким образом колонкам применяется top-level [DISTINCT](distinct.md); -* таким же образом вычисляются все подзапросы в [UNION ALL](union.md#union-all), выполняется их объединение; +* таким же образом вычисляются все подзапросы в операторах [UNION [ALL]](operators.md#union), [INTERSECT [ALL]](operators.md#intersect), [EXCEPT [ALL]](operators.md#except) и выполняется их объединение, пересечение, исключение соответственно; в текущей реализации комбинация `INTERSECT [ALL]`, `EXCEPT [ALL]` и `UNION [ALL]` не поддерживается, также не поддерживается использование более одного оператора `INTERSECT [ALL]` или `EXCEPT [ALL]` в `SELECT` выражении; * выполняется сортировка согласно [ORDER BY](order_by.md); * к полученному результату применяются [OFFSET и LIMIT](limit_offset.md). ## Порядок колонок в YQL {#orderedcolumns} В стандартном SQL порядок колонок указанных в проекции (в `SELECT`) имеет значение. Помимо того, что порядок колонок должен сохраняться при отображении результатов запроса или при записи в новую таблицу, некоторые конструкции SQL этот порядок используют. -Это относится в том числе к [UNION ALL](union.md#union-all) и к позиционному [ORDER BY](order_by.md) (ORDER BY ordinal). +Это относится в том числе к операторам [UNION [ALL]](operators.md#union), [INTERSECT [ALL]](operators.md#intersect), [EXCEPT [ALL]](operators.md#except) и к позиционному [ORDER BY](order_by.md) (ORDER BY ordinal). По умолчанию в YQL порядок колонок игнорируется: * порядок колонок в выходных таблицах и в результатах запроса не определен -* схема данных результата `UNION ALL` выводится по именам колонок, а не по позициям +* схема данных результата `UNION [ALL]`, `INTERSECT [ALL]` и `EXCEPT [ALL]` выводится по именам колонок, а не по позициям При включении `PRAGMA OrderedColumns;` порядок колонок сохраняется в результатах запроса и выводится из порядка колонок во входных таблицах по следующим правилам: * `SELECT` с явным перечислением колонок задает соответствующий порядок; * `SELECT` со звездочкой (`SELECT * FROM ...`) наследует порядок из своего входа; * порядок колонок после [JOIN](../join.md): сначала колонки левой стороны, потом правой. Если порядок какой-либо из сторон присутствующей в выходе `JOIN` не определен, порядок колонок результата также не определен; -* порядок `UNION ALL` зависит от режима выполнения [UNION ALL](union.md#union-all); +* порядок `UNION [ALL]`, `INTERSECT [ALL]` и `EXCEPT [ALL]` зависит от [режима выполнения](operators.md#positional-mode); * порядок колонок для [AS_TABLE](from_as_table.md) не определен; ## Комбинация запросов {#combining-queries} -Результаты нескольких SELECT (или подзапросов) могут быть объединены с помощью ключевых слов `UNION` и `UNION ALL`. +Результаты нескольких `SELECT` (или подзапросов) могут быть объединены с помощью ключевых слов `UNION` и `UNION ALL`. ```yql query1 UNION [ALL] query2 (UNION [ALL] query3 ...) @@ -74,17 +74,71 @@ query1 UNION query2 UNION ALL query3 (query1 UNION query2) UNION ALL query3 ``` +Пересечение только двух `SELECT` (или подзапросов) может быть вычислено с помощью ключевых слов `INTERSECT` и `INTERSECT ALL`. + +```yql +query1 INTERSECT query2 +``` + +Запрос из нескольких операторов `INTERSECT [ALL]` не допускается. + +```yql +query1 INTERSECT query2 INTERSECT query3 ... -- ошибка + +query1 INTERSECT query2 INTERSECT ALL query3 ... -- ошибка +``` + +Исключение только двух `SELECT` (или подзапросов) может быть вычислено с помощью ключевых слов `EXCEPT` и `EXCEPT ALL`. + +```yql +query1 EXCEPT query2 +``` + +Запрос из нескольких операторов `EXCEPT [ALL]` не допускается. + +```yql +query1 EXCEPT query2 EXCEPT query3 -- ошибка + +query1 EXCEPT query2 EXCEPT ALL query3 -- ошибка +``` + +Одновременное использование двух разных операторов `UNION`, `INTERSECT` и `EXCEPT` в одном запросе не допускается. + +```yql +query1 UNION query2 INTERSECT query3 -- ошибка + +query1 UNION query2 EXCEPT query3 -- ошибка + +query1 INTERSECT query2 EXCEPT query3 -- ошибка +``` + +Данное поведение не зависит от наличия или отсутствия `DISTINCT` / `ALL`. + +```yql +query1 UNION ALL query2 INTERSECT ALL query3 -- ошибка + +query1 UNION ALL query2 EXCEPT ALL query3 -- ошибка + +query1 INTERSECT ALL query2 EXCEPT ALL query3 -- ошибка +``` + +{% note warning %} + +Только `UNION` и `UNION ALL` могут использоваться несколько раз (больше 1). Использование `INTERSECT`, `INTERSECT ALL`, `EXCEPT` и `EXCEPT ALL` несколько раз не допускается. + +{% endnote %} + При наличии `ORDER BY/LIMIT/DISCARD/INTO RESULT` в объединяемых подзапросах применяются следующие правила: * `ORDER BY/LIMIT/INTO RESULT` допускается только после последнего подзапроса; * `DISCARD` допускается только перед первым подзапросом; -* указанные операторы действуют на результат `UNION [ALL]`, а не на подзапрос; +* указанные операторы действуют на результат `UNION [ALL]`, `INTERSECT [ALL]` или `EXCEPT [ALL]`, а не на подзапрос; * чтобы применить оператор к подзапросу, подзапрос необходимо взять в скобки. ## Обращение к нескольким таблицам в одном запросе -В стандартном SQL для выполнения запроса по нескольким таблицам используется [UNION ALL](../select/union.md#union_all), который объединяет результаты двух и более `SELECT`. Это не совсем удобно для сценария использования, в котором требуется выполнить один и тот же запрос по нескольким таблицам (например, содержащим данные на разные даты). В YQL, чтобы было удобнее, в `SELECT` после `FROM` можно указывать не только одну таблицу или подзапрос, но и вызывать встроенные функции, позволяющие объединять данные нескольких таблиц. +В стандартном SQL для выполнения запроса по нескольким таблицам используется [UNION ALL](operators.md#union-all), который объединяет результаты двух и более `SELECT`. Это не совсем удобно для сценария использования, в котором требуется выполнить один и тот же запрос по нескольким таблицам (например, содержащим данные на разные даты). В YQL, чтобы было удобнее, в `SELECT` после `FROM` можно указывать не только одну таблицу или подзапрос, но и вызывать встроенные функции, позволяющие объединять данные нескольких таблиц. Для этих целей определены следующие функции: @@ -100,7 +154,7 @@ query1 UNION query2 UNION ALL query3 {% endnote %} -По умолчанию схемы всех участвующих таблиц объединяются по правилам [UNION ALL](../select/index.md#union_all). Если объединение схем не желательно, то можно использовать функции с суффиксом `_STRICT`, например `CONCAT_STRICT`, которые работают полностью аналогично оригинальным, но считают любое расхождение в схемах таблиц ошибкой. +По умолчанию схемы всех участвующих таблиц объединяются по правилам [UNION ALL](operators.md#union-all). Если объединение схем не желательно, то можно использовать функции с суффиксом `_STRICT`, например `CONCAT_STRICT`, которые работают полностью аналогично оригинальным, но считают любое расхождение в схемах таблиц ошибкой. Все аргументы описанных выше функций могут быть объявлены отдельно через [именованные выражения](../expressions.md#named-nodes). В этом случае в них также допустимы и простые выражения посредством неявного вызова [EvaluateExpr](../../builtins/basic.md#evaluate_expr_atom). @@ -132,7 +186,7 @@ SELECT * FROM EACH($tables); -- идентично предыдущему при * [FROM SELECT](from_select.md) * [DISTINCT](distinct.md) * [UNIQUE DISTINCT](unique_distinct_hints.md) -* [UNION](union.md) +* [UNION INTERSECT EXCEPT](operators.md) * [WITH](with.md) * [WITHOUT](without.md) * [WHERE](where.md) diff --git a/yql/essentials/docs/ru/syntax/select/operators.md b/yql/essentials/docs/ru/syntax/select/operators.md new file mode 100644 index 00000000000..88672fdfb9c --- /dev/null +++ b/yql/essentials/docs/ru/syntax/select/operators.md @@ -0,0 +1,248 @@ +# Операции с результатами подзапросов: UNION, INTERSECT, EXCEPT + +## Объединение (UNION) {#union} + +Объединение результатов нескольких `SELECT` (или подзапросов) с удалением дубликатов. +Поведение идентично последовательному исполнению `UNION ALL` и `SELECT DISTINCT *`. +См. [UNION ALL](#union-all) для информации о деталях поведения. + +```yql +SELECT key FROM T1 +UNION +SELECT key FROM T2; +``` + +Также допускается явное указание ключевого слова `DISTINCT`, которое не влияет на результат выполнения. + +```yql +SELECT key FROM T1 +UNION DISTINCT +SELECT key FROM T2; +``` + +#### Пример + +```yql +SELECT * FROM (VALUES (1, 2)) AS t(x, y) +UNION +SELECT * FROM (VALUES (1, 2)) AS t(x, y); +``` +``` +x y +1 2 +``` + +## Объединение c дубликатами (UNION ALL) {#union-all} + +Объединение результатов нескольких `SELECT` (или подзапросов) без удаления дубликатов. + +```yql +SELECT key FROM T1 +UNION ALL +SELECT key FROM T2; +``` + +#### Пример + +```yql +SELECT * FROM (VALUES (1, 2)) AS t(x, y) +UNION ALL +SELECT * FROM (VALUES (1, 2)) AS t(x, y); +``` +``` +x y +1 2 +1 2 +``` + +## Пересечение (INTERSECT) {#intersect} + +Пересечение результатов двух `SELECT` (или подзапросов) с удалением дубликатов. +Поведение идентично последовательному исполнению `INTERSECT ALL` и `SELECT DISTINCT *`. +См. [INTERSECT ALL](#intersect-all) для информации о деталях поведения. + +```yql +SELECT key FROM T1 +INTERSECT +SELECT key FROM T2; +``` + +Также допускается явное указание ключевого слова `DISTINCT`, которое не влияет на результат выполнения. + +```yql +SELECT key FROM T1 +INTERSECT DISTINCT +SELECT key FROM T2; +``` + +#### Пример + +```yql +SELECT * FROM (VALUES (1), (1), (1), (2)) AS t(x) +INTERSECT +SELECT * FROM (VALUES (1), (1)) AS t(x); +``` +``` +x +1 +``` + +## Пересечение с дубликатами (INTERSECT ALL) {#intersect-all} + +Пересечение результатов двух `SELECT` (или подзапросов) без удаления дубликатов. + +```yql +SELECT key FROM T1 +INTERSECT ALL +SELECT key FROM T2; +``` + +Результатом запроса является таблица дублирующихся строк, лежащих в обеих исходных таблицах. +Количество дубликатов строк равно минимуму из вхождений в каждую из исходных таблиц. + +#### Пример + +```yql +SELECT * FROM (VALUES (1), (1), (1), (2)) AS t(x) +INTERSECT ALL +SELECT * FROM (VALUES (1), (1)) AS t(x); +``` +``` +x +1 +1 +``` + +## Исключение (EXCEPT) {#except} + +Исключение результатов одного `SELECT` (или подзапроса) из результатов другого. + +```yql +SELECT key FROM T1 +EXCEPT +SELECT key FROM T2; +``` + +Также допускается явное указание ключевого слова `DISTINCT`, которое не влияет на результат выполнения. + +```yql +SELECT key FROM T1 +EXCEPT DISTINCT +SELECT key FROM T2; +``` + +Результатом запроса является таблица уникальных строк, лежащих в первой исходной таблице и не лежащих во второй. + +#### Пример + +```yql +SELECT * FROM (VALUES (1), (1), (1), (2)) AS t(x) +EXCEPT +SELECT * FROM (VALUES (1)) AS t(x); +``` +``` +x +2 +``` + +## Исключение с дубликатами (EXCEPT ALL) {#except-all} + +Исключение результатов одного `SELECT` (или подзапроса) из результатов другого с учётом дубликатов (количества вхождений). + +```yql +SELECT key FROM T1 +EXCEPT ALL +SELECT key FROM T2; +``` + +Результатом запроса является таблица дублирующихся строк, которые встречаются в первой таблице чаще, чем во второй. +Количество дубликатов строк равно разности количества вхождений в первую и количества вхождений во вторую. + +#### Пример + +```yql +SELECT * FROM (VALUES (1), (1), (1), (2)) AS t(x) +EXCEPT ALL +SELECT * FROM (VALUES (1)) AS t(x); +``` +``` +x +2 +1 +1 +``` + +## Режимы "по именам" и "по позициям" {#positional-mode} + +Поддерживаются два режима выполнения вышеперечисленных операций – по именам колонок (режим по умолчанию) и по позициям колонок (соответствует стандарту ANSI SQL и включается через соответствующую [PRAGMA](../pragma/global.md#positionalunionall)). + +### По именам колонок + +В режиме "по именам" результирующая схема данных выводится по следующим правилам: + +* в результирующую таблицу включаются все колонки, которые встречались хоть в одной из входных таблиц; +* если колонка присутствовала не во всех входных таблицах, то ей автоматически присваивается [опциональный тип данных](../../types/optional.md) (допускающий значение `NULL`); +* если колонка в разных входных таблицах имела разные типы, то выводится общий тип (наиболее широкий); +* если колонка в разных входных таблицах имела разнородный тип, например строку и число, то это считается ошибкой. + +Порядок выходных колонок в этом режиме выводится как наибольший общий префикс порядка входов, после чего следуют все остальные колонки в алфавитном порядке. +Если наибольший общий префикс пуст (в том числе и из-за отсутствия порядка на одном из входов), то порядок выхода не определен. + +#### Пример + +В результате выполнения данного запроса по умолчанию, в режиме "по именам", будет сформирована выборка с тремя колонками `x`, `y`, и `z`: +```yql +SELECT 1 AS x +UNION ALL +SELECT 2 AS y +UNION ALL +SELECT 3 AS z; +``` +``` +x y z +1 + 2 + 3 +``` + +### По позициям колонок + +В режиме "по позициям" результирующая схема данных выводится по следующим правилам: + +* число колонок во всех входах должно быть одинаковым; +* порядок колонок во всех входах должен быть определен; +* имена результирующих колонок совпадают с именами колонок первой таблицы; +* тип результирующих колонок выводится как общий (наиболее широкий) тип из типов входных колонок стоящих на одинаковых позициях. + +Порядок выходных колонок в этом режиме совпадает с порядком колонок первого входа. + +#### Пример + +При включенной `PRAGMA PositionalUnionAll;` в следующем запросе результатом будет одна колонка `x`: +```yql +PRAGMA PositionalUnionAll; + +SELECT 1 AS x +UNION ALL +SELECT 2 AS y +UNION ALL +SELECT 3 AS z; +``` +``` +x +1 +2 +3 +``` + +Если порядок колонок не определён (например, при использовании `AS_TABLE`), запрос завершается с ошибкой: +```yql +PRAGMA PositionalUnionAll; + +SELECT 1 AS x, 2 as y +UNION ALL +SELECT * FROM AS_TABLE([<|x:3, y:4|>]); +``` +``` +Input #1 does not have ordered columns... +``` diff --git a/yql/essentials/docs/ru/syntax/select/toc_i.yaml b/yql/essentials/docs/ru/syntax/select/toc_i.yaml index 96a97add04a..184e9bab78b 100644 --- a/yql/essentials/docs/ru/syntax/select/toc_i.yaml +++ b/yql/essentials/docs/ru/syntax/select/toc_i.yaml @@ -1,17 +1,17 @@ items: -- { name: Обзор, href: index.md } -- { name: FROM, href: from.md } -- { name: FROM AS_TABLE, href: from_as_table.md } -- { name: FROM SELECT, href: from_select.md } -- { name: DISTINCT, href: distinct.md } -- { name: UNIQUE DISTINCT, href: unique_distinct_hints.md } -- { name: UNION, href: union.md } -- { name: CONCAT, href: concat.md } -- { name: WITH, href: with.md } -- { name: WITHOUT, href: without.md } -- { name: WHERE, href: where.md } -- { name: ORDER BY, href: order_by.md } -- { name: ASSUME ORDER BY, href: assume_order_by.md } -- { name: LIMIT OFFSET, href: limit_offset.md } -- { name: SAMPLE, href: sample.md } -- { name: TABLESAMPLE, href: sample.md } +- { name: Обзор, href: index.md } +- { name: FROM, href: from.md } +- { name: FROM AS_TABLE, href: from_as_table.md } +- { name: FROM SELECT, href: from_select.md } +- { name: DISTINCT, href: distinct.md } +- { name: UNIQUE DISTINCT, href: unique_distinct_hints.md } +- { name: UNION INTERSECT EXCEPT, href: operators.md } +- { name: CONCAT, href: concat.md } +- { name: WITH, href: with.md } +- { name: WITHOUT, href: without.md } +- { name: WHERE, href: where.md } +- { name: ORDER BY, href: order_by.md } +- { name: ASSUME ORDER BY, href: assume_order_by.md } +- { name: LIMIT OFFSET, href: limit_offset.md } +- { name: SAMPLE, href: sample.md } +- { name: TABLESAMPLE, href: sample.md } diff --git a/yql/essentials/docs/ru/syntax/select/union.md b/yql/essentials/docs/ru/syntax/select/union.md deleted file mode 100644 index 4b1770bfa8e..00000000000 --- a/yql/essentials/docs/ru/syntax/select/union.md +++ /dev/null @@ -1,68 +0,0 @@ -# Объединение результатов подзапросов (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/global.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 -``` - |