summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-07-02 13:40:47 +0300
committerrobot-piglet <[email protected]>2025-07-02 13:56:04 +0300
commit37ea90b963d2b473339da65de917cd881dcd971f (patch)
treea39324852121be7801f51d923e200feb65e1e0f1
parentd92bd641fb97e9b3768d08a5b3a98d444d827b2c (diff)
Intermediate changes
commit_hash:a2f70c63e4943b44671b6f155937a59fea7fc673
-rw-r--r--yql/essentials/docs/ru/syntax/expressions.md2
-rw-r--r--yql/essentials/docs/ru/syntax/pragma/global.md4
-rw-r--r--yql/essentials/docs/ru/syntax/select/concat.md4
-rw-r--r--yql/essentials/docs/ru/syntax/select/index.md78
-rw-r--r--yql/essentials/docs/ru/syntax/select/operators.md248
-rw-r--r--yql/essentials/docs/ru/syntax/select/toc_i.yaml32
-rw-r--r--yql/essentials/docs/ru/syntax/select/union.md68
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);
* векторный контекст &mdash; после [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
-```
-