ClickHouse/docs/ru/sql-reference/statements/select/with.md
Anna 0f92fe9ad2
DOCSUP-3118: Document the named subqueries WITH AS (#16339)
* Update WITH desc

* Update docs/en/sql-reference/statements/select/with.md

Co-authored-by: BayoNet <da-daos@yandex.ru>

* Update docs/en/sql-reference/statements/select/with.md

Co-authored-by: BayoNet <da-daos@yandex.ru>

* Update docs/en/sql-reference/statements/select/with.md

Co-authored-by: BayoNet <da-daos@yandex.ru>

* Fixed, ru translated

* Update docs/en/sql-reference/statements/select/with.md

Co-authored-by: BayoNet <da-daos@yandex.ru>

* Fixed syntax description

* Update docs/ru/sql-reference/statements/select/with.md

Co-authored-by: BayoNet <da-daos@yandex.ru>

* Update

Co-authored-by: BayoNet <da-daos@yandex.ru>
2020-10-29 21:22:28 +03:00

2.2 KiB

toc_title
WITH

Секция WITH

Clickhouse поддерживает Общие табличные выражения, то есть позволяет использовать результаты выражений из секции WITH в остальной части SELECT запроса. Именованные подзапросы могут быть включены в текущий и дочерний контекст запроса в тех местах, где разрешены табличные объекты. Рекурсия предотвращается путем скрытия общего табличного выражения текущего уровня из выражения WITH.

Синтаксис

WITH <expression> AS <identifier>

или

WITH <identifier> AS <subquery expression>

Примеры

Пример 1: Использование константного выражения как «переменной»

WITH '2019-08-01 15:23:00' as ts_upper_bound
SELECT *
FROM hits
WHERE
    EventDate = toDate(ts_upper_bound) AND
    EventTime <= ts_upper_bound;

Пример 2: Выкидывание выражения sum(bytes) из списка колонок в SELECT

WITH sum(bytes) as s
SELECT
    formatReadableSize(s),
    table
FROM system.parts
GROUP BY table
ORDER BY s;

Пример 3: Использование результатов скалярного подзапроса

/* запрос покажет TOP 10 самых больших таблиц */
WITH
    (
        SELECT sum(bytes)
        FROM system.parts
        WHERE active
    ) AS total_disk_usage
SELECT
    (sum(bytes) / total_disk_usage) * 100 AS table_disk_usage,
    table
FROM system.parts
GROUP BY table
ORDER BY table_disk_usage DESC
LIMIT 10;

Пример 4: Переиспользование выражения

WITH test1 AS (SELECT i + 1, j + 1 FROM test1) 
SELECT * FROM test1;

Оригинальная статья