Оператор ARRAY JOIN
Операция, при которой таблицы с массивами столбцов создают новую таблицу, в которой находится столбец с каждым отдельным элементом массива из этого начального столбца, а значения других столбцов дублируются, является распространенной. Это основной случай того, что делает оператор ARRAY JOIN
.
Его название связано с тем, что его можно рассматривать как выполнение JOIN
с массивом или вложенной структурой данных. Намерение похоже на функцию arrayJoin, но функциональность оператора шире.
Синтаксис:
Поддерживаемые типы ARRAY JOIN
перечислены ниже:
ARRAY JOIN
- В базовом случае пустые массивы не включаются в результатJOIN
.LEFT ARRAY JOIN
- РезультатJOIN
содержит строки с пустыми массивами. Значение для пустого массива устанавливается в значение по умолчанию для типа элементов массива (обычно 0, пустая строка или NULL).
Примеры базового ARRAY JOIN
Примеры ниже демонстрируют использование операторов ARRAY JOIN
и LEFT ARRAY JOIN
. Создадим таблицу со столбцом типа Array и вставим в нее значения:
Пример ниже использует оператор ARRAY JOIN
:
Следующий пример использует оператор LEFT ARRAY JOIN
:
Использование псевдонимов
При указании псевдонима для массива в операторе ARRAY JOIN
, элемент массива может быть доступен через этот псевдоним, но сам массив доступен под оригинальным именем. Пример:
Используя псевдонимы, вы можете выполнить ARRAY JOIN
с внешним массивом. Например:
Несколько массивов могут быть разделены запятыми в операторе ARRAY JOIN
. В этом случае JOIN
выполняется с ними одновременно (прямой суммой, а не декартовым произведением). Обратите внимание, что все массивы должны иметь одинаковый размер по умолчанию. Пример:
Пример ниже использует функцию arrayEnumerate:
Несколько массивов разного размера можно объединить, используя: SETTINGS enable_unaligned_array_join = 1
. Пример:
ARRAY JOIN с вложенной структурой данных
ARRAY JOIN
также работает с вложенными структурами данных:
При указании имен вложенных структур данных в ARRAY JOIN
смысл остается тем же, что и в ARRAY JOIN
со всеми элементами массива, из которых он состоит. Ниже приведены примеры:
Эта вариация также имеет смысл:
Можно использовать псевдоним для вложенной структуры данных, чтобы выбрать либо результат JOIN
, либо исходный массив. Пример:
Пример использования функции arrayEnumerate:
Детали реализации
Порядок выполнения запроса оптимизируется при запуске ARRAY JOIN
. Хотя ARRAY JOIN
всегда должен быть указан до WHERE/PREWHERE в запросе, технически они могут выполняться в любом порядке, если результат ARRAY JOIN
не используется для фильтрации. Порядок обработки контролируется оптимизатором запросов.
Неподходящесть с короткозамыканием функции
Короткозамыкание функций - это функция, которая оптимизирует выполнение сложных выражений в специфических функциях, таких как if
, multiIf
, and
и or
. Она предотвращает возможные исключения, такие как деление на ноль, которые могут возникнуть во время выполнения этих функций.
arrayJoin
всегда выполняется и не поддерживается для короткозамыкания функции. Это связано с тем, что это уникальная функция, обрабатываемая отдельно от всех других функций во время анализа и выполнения запроса и требующая дополнительной логики, которая не работает с короткозамыканием функции. Причина в том, что количество строк в результате зависит от результата arrayJoin
, и внедрение ленивого выполнения arrayJoin
слишком сложно и затратное.