CREATE TABLE объявляет вложенную структуру данных Goals, которая содержит данные о конверсиях, то есть о достигнутых целях.
Каждая строка в таблице ‘visits’ может соответствовать нулю, одной или нескольким конверсиям.
Если настройка flatten_nested установлена в 0 (по умолчанию flatten_nested=1), поддерживаются произвольные уровни вложенности.
В большинстве случаев при работе с вложенной структурой данных её столбцы задаются именами, разделёнными точкой.
Эти столбцы образуют массивы соответствующих типов.
Все массивы столбцов в одной вложенной структуре данных имеют одинаковую длину.
Например:
Фильтрация столбцов Nested в WHERE
Nested хранится как Array, обращение к нему в предложении WHERE возвращает для каждой строки весь массив, а не отдельный элемент. Нельзя напрямую сравнивать вложенный столбец со скалярным значением, поэтому вместо этого нужно использовать функции для работы с массивами.
Например, этот запрос не просто незаметно возвращает ноль строк — он вызывает исключение, потому что Goals.ID имеет тип Array(UInt32), а equals(Array(UInt32), UInt32) не является допустимым сравнением:
has, чтобы проверить, есть ли в массиве определённое значение:
arrayExists, если условие сложнее:
length или исключать пустые массивы с помощью notEmpty:
ARRAY JOIN, чтобы развернуть массивы.
После ARRAY JOIN каждый элемент становится отдельной строкой, поэтому предложение WHERE применяется к скалярным значениям.
Дополнительную информацию см. в разделе предложение ARRAY JOIN. Пример:
SELECT для всей вложенной структуры данных целиком. Можно только явно перечислить отдельные столбцы, входящие в её состав.
Вставка данных
INSERT все массивы столбцов-компонентов вложенной структуры данных нужно передавать отдельно, как если бы это были массивы отдельных столбцов. При вставке система проверяет, что все они имеют одинаковую длину.
Каждый вложенный подстолбец указывается в списке столбцов в точечной нотации (Goals.ID, Goals.Serial, …), а соответствующие значения задаются как массивы:
DESCRIBE столбцы вложенной структуры данных также перечисляются отдельно.
Ограничения ALTER
ALTER для вложенных структур данных имеют следующие ограничения:
Добавление подстолбцов работает как обычно. Вы можете добавить новый подстолбец в существующую структуру Nested:
- Переименовать всю вложенную структуру целиком (например,
GoalsвConversions). - Переместить подстолбец в другую вложенную структуру (например,
Goals.IDвOtherNested.ID). - Переместить подстолбец из вложенной структуры наружу или, наоборот, внутрь неё (например,
Goals.IDвGoalIDи наоборот).