---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/yql/reference/syntax/create_table/as_select.md
  - https://ydb.tech/docs/ru/yql/reference/syntax/create_table/as_select.md
sourcePath: ru/core/yql/reference/syntax/create_table/as_select.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Создание и заполнение таблицы на основе результатов запроса

<!-- source: ru/_includes/not_allow_for_oltp_note.md -->
{% note warning %}

<!-- source: ru/_includes/not_allow_for_oltp_text.md -->
Поддерживается только для [колоночных](https://ydb.tech/docs/ru/concepts/datamodel/table.md#column-oriented-tables) таблиц. Поддержка функциональности для [строковых](https://ydb.tech/docs/ru/concepts/datamodel/table.md#row-oriented-tables) таблиц находится в разработке.
<!-- endsource: ru/_includes/not_allow_for_oltp_text.md -->

{% endnote %}
<!-- endsource: ru/_includes/not_allow_for_oltp_note.md -->

Вызов `CREATE TABLE AS` создает новую [таблицу](../../../../concepts/datamodel/table), которая заполнена данными из результатов запроса.

```yql
CREATE TABLE table_name (
    PRIMARY KEY ( column, ... )
)
WITH ( key = value, ... )
AS SELECT ...
```

Имена и типы колонок будут соответствовать результатам `SELECT`.
Для колонок [неопционального типа](https://ydb.tech/docs/ru/yql/reference/types/optional.md) также будет выставлен модификатор `NOT NULL`.

При создании таблицы через `CREATE TABLE AS` не поддерживается указание имен колонок, [вторичных индексов](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/secondary_index.md), [векторных индексов](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/vector_index.md), [групп колонок](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/family.md). Имена и типы данных для столбцов новой таблицы автоматически наследуются из результирующего набора запроса SELECT. Все вышеперечисленное можно изменять при помощи [`ALTER TABLE`](https://ydb.tech/docs/ru/yql/reference/syntax/alter_table/index.md) после создания таблицы. При этом поддерживаются [дополнительные параметры](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/with.md).


## Особенности

{% note warning %}

Запись строк производится с полной перезаписью строки, как при использовании [`REPLACE INTO`](https://ydb.tech/docs/ru/yql/reference/syntax/replace_into.md), но при этом отсутствуют гарантии на порядок записи строк в таблицу.

Если `SELECT` вернул 2 или более строки с одним и тем же значением первичного ключа, то после завершения выполнения `CREATE TABLE AS` в созданной таблице будет только одна запись с таким значением первичного ключа. При этом какая именно из записей найденных в `SELECT` будет добавлена - в общем случае не определено.

{% endnote %}


* `CREATE TABLE AS` поддерживается только в режиме [неявного контроля транзакций](https://ydb.tech/docs/ru/concepts/transactions.md#implicit). Таблица появится по указанному пути уже заполненной.

* `CREATE TABLE AS` может быть только единственным [DML](https://en.wikipedia.org/wiki/Data_manipulation_language)/[DDL](https://en.wikipedia.org/wiki/Data_definition_language) выражением в запросе. Допустимо использование [PRAGMA](https://ydb.tech/docs/ru/yql/reference/syntax/pragma.md), [DECLARE](https://ydb.tech/docs/ru/yql/reference/syntax/declare.md) и [именованных выражений](https://ydb.tech/docs/ru/yql/reference/syntax/expressions.md#named-nodes).

* `CREATE TABLE AS` не конфликтует с другими транзакциями. При выполнении запроса не используются блокировки, а все чтения производятся из консистентного снапшота. Балансировка или разделение [таблеток](https://ydb.tech/docs/ru/concepts/glossary.md#tablet) не приводят к ошибкам.

* `CREATE TABLE AS` позволяет использовать в одном запросе и [колоночные таблицы](https://ydb.tech/docs/ru/concepts/glossary.md#column-oriented-table), и [строковые таблицы](https://ydb.tech/docs/ru/concepts/glossary.md#row-oriented-table).

* `CREATE TABLE AS` создаёт таблицу во временной директории `.tmp/sessions`, а после успешной записи данных перемещает её в указанное место. Если операция прервётся из-за ошибки, временная таблица не удаляется мгновенно, а остаётся в системе ещё на некоторое время.

## Примеры

* Создание колоночной таблицы из результатов запроса

```yql
CREATE TABLE my_table (
    PRIMARY KEY (key1, key2)
) WITH (
    STORE=COLUMN
) AS SELECT 
    key AS key1,
    Unwrap(other_key) AS key2,
    value,
    String::Contains(value, "test") AS has_test
FROM other_table;
```
