Nested(name1 Type1, Name2 Type2, …)
Вложенная структура данных похожа на таблицу внутри ячейки. Параметры вложенной структуры данных — имена столбцов и типы — задаются так же, как в запросе CREATE TABLE. Каждой строке таблицы может соответствовать любое количество строк во вложенной структуре данных.
Избегайте точек в именах столбцовИмена столбцов, содержащие точки, столбцы с общим префиксом до точки и столбцы типа Array могут интерпретироваться как часть развёрнутой структуры Nested, если flatten_nested = 1 (значение по умолчанию). Это может привести к неожиданной проверке длины массивов при вставке и ограничениям на переименование.По возможности не используйте точки в именах столбцов.
Вместо точек используйте символ подчёркивания (_) или другой разделитель, если только вам не нужна именно семантика Nested.
Пример:
CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
В этом примере объявляется вложенная структура данных Goals, содержащая данные о конверсиях (достигнутых целях). Каждой строке таблицы ‘visits’ может соответствовать ноль, одна или несколько конверсий.
Если flatten_nested установлена в 0 (по умолчанию это не так), поддерживаются произвольные уровни вложенности.
В большинстве случаев при работе с вложенной структурой данных её столбцы задаются именами столбцов, разделёнными точкой. Эти столбцы образуют массивы соответствующих типов. Все массивы столбцов в пределах одной вложенной структуры данных имеют одинаковую длину.
Пример:
SELECT
Goals.ID,
Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐
│ [1073752,591325,591325] │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27'] │
│ [1073752] │ ['2014-03-17 00:28:25'] │
│ [1073752] │ ['2014-03-17 10:46:20'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │
│ [] │ [] │
│ [1073752,591325,591325] │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21'] │
│ [] │ [] │
│ [] │ [] │
│ [591325,1073752] │ ['2014-03-17 00:46:05','2014-03-17 00:46:05'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
Проще всего представить вложенную структуру данных как набор из нескольких массивов столбцов одинаковой длины.
Единственное место, где в запросе SELECT можно указать имя всей вложенной структуры данных вместо отдельных столбцов, — это конструкция ARRAY JOIN. Подробнее см. “конструкцию ARRAY JOIN”. Пример:
SELECT
Goal.ID,
Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goal.ID─┬──────Goal.EventTime─┐
│ 1073752 │ 2014-03-17 16:38:10 │
│ 591325 │ 2014-03-17 16:38:48 │
│ 591325 │ 2014-03-17 16:42:27 │
│ 1073752 │ 2014-03-17 00:28:25 │
│ 1073752 │ 2014-03-17 10:46:20 │
│ 1073752 │ 2014-03-17 13:59:20 │
│ 591325 │ 2014-03-17 22:17:55 │
│ 591325 │ 2014-03-17 22:18:07 │
│ 591325 │ 2014-03-17 22:18:51 │
│ 1073752 │ 2014-03-17 11:37:06 │
└─────────┴─────────────────────┘
Нельзя выполнить SELECT для всей вложенной структуры данных целиком. Можно только явно перечислить отдельные столбцы, которые в неё входят.
Для запроса INSERT все массивы столбцов, входящих во вложенную структуру данных, следует передавать по отдельности (как если бы это были массивы отдельных столбцов). Во время вставки система проверяет, что их длины совпадают.
Для запроса DESCRIBE столбцы вложенной структуры данных перечисляются отдельно таким же образом.
Запрос ALTER для элементов вложенной структуры данных имеет ограничения.Последнее изменение 10 июня 2026 г.