2020-10-26 10:29:30 +00:00
---
toc_title: WITH
---
2020-10-29 18:22:28 +00:00
# Секция WITH {#with-clause}
2020-05-15 04:34:54 +00:00
2020-10-29 18:22:28 +00:00
Clickhouse поддерживает [Общие табличные выражения ](https://ru.wikipedia.org/wiki/Ие р а р х иче с кие _и_р е ку р с ивные _за пр о с ы_в_SQL ), то есть позволяет использовать результаты выражений из секции `WITH` в остальной части `SELECT` запроса. Именованные подзапросы могут быть включены в текущий и дочерний контекст запроса в тех местах, где разрешены табличные объекты. Рекурсия предотвращается путем скрытия общего табличного выражения текущего уровня из выражения `WITH` .
2020-05-15 04:34:54 +00:00
2020-10-29 18:22:28 +00:00
## Синтаксис
2020-05-15 04:34:54 +00:00
2020-10-29 18:22:28 +00:00
``` sql
WITH < expression > AS < identifier >
```
или
``` sql
WITH < identifier > AS < subquery expression >
```
## Примеры
2020-05-15 04:34:54 +00:00
**Пример 1:** Использование константного выражения как «переменной»
``` sql
WITH '2019-08-01 15:23:00' as ts_upper_bound
SELECT *
FROM hits
WHERE
EventDate = toDate(ts_upper_bound) AND
2020-10-29 18:22:28 +00:00
EventTime < = ts_upper_bound;
2020-05-15 04:34:54 +00:00
```
**Пример 2:** Выкидывание выражения sum(bytes) из списка колонок в SELECT
``` sql
WITH sum(bytes) as s
SELECT
formatReadableSize(s),
table
FROM system.parts
GROUP BY table
2020-10-29 18:22:28 +00:00
ORDER BY s;
2020-05-15 04:34:54 +00:00
```
**Пример 3:** Использование результатов скалярного подзапроса
``` sql
/* запрос покажет 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
2020-10-29 18:22:28 +00:00
LIMIT 10;
2020-05-15 04:34:54 +00:00
```
**Пример 4:** Переиспользование выражения
``` sql
2020-10-29 18:22:28 +00:00
WITH test1 AS (SELECT i + 1, j + 1 FROM test1)
SELECT * FROM test1;
2020-05-15 04:34:54 +00:00
```