Для таблиц, содержащих столбец типа Array, часто требуется построить новую таблицу, в которой каждому отдельному элементу массива из исходного столбца соответствует своя строка, а значения остальных столбцов дублируются. Это базовый вариант использования предложения ARRAY JOIN.
Название связано с тем, что его можно рассматривать как выполнение JOIN с массивом или вложенной структурой данных. По назначению оно похоже на функцию arrayJoin, но возможности предложения шире.
Синтаксис:
Поддерживаемые типы ARRAY JOIN перечислены ниже:
ARRAY JOIN - В обычном случае пустые массивы не включаются в результат JOIN.
LEFT ARRAY JOIN - Результат JOIN содержит строки с пустыми массивами. Для пустого массива используется значение по умолчанию для типа элемента массива (обычно 0, пустая строка или NULL).
Простые примеры ARRAY JOIN
ARRAY JOIN и LEFT ARRAY JOIN
Приведенные ниже примеры показывают, как использовать предложения ARRAY JOIN и LEFT ARRAY JOIN. Давайте создадим таблицу со столбцом типа Array и вставим в него значения:
В примере ниже используется предложение ARRAY JOIN:
В следующем примере используется предложение LEFT ARRAY JOIN:
ARRAY JOIN и функция arrayEnumerate
Эта функция обычно используется с ARRAY JOIN. Она позволяет выполнять подсчёт только один раз для каждого массива после применения ARRAY JOIN. Пример:
В этом примере Reaches — это количество конверсий (строк, полученных после применения ARRAY JOIN), а Hits — количество просмотров страниц (строк до применения ARRAY JOIN). В этом случае тот же результат можно получить более простым способом:
ARRAY JOIN и arrayEnumerateUniq
Эта функция полезна при использовании ARRAY JOIN и агрегировании элементов массива.
В этом примере для каждого ID цели вычисляется число конверсий (каждый элемент во вложенной структуре данных Goals — это достигнутая цель, которую мы называем конверсией) и число сеансов. Без ARRAY JOIN мы бы посчитали число сеансов как sum(Sign). Но в данном случае строки были продублированы вложенной структурой Goals, поэтому, чтобы после этого учитывать каждый сеанс только один раз, мы применяем условие к значению функции arrayEnumerateUniq(Goals.ID).
Использование псевдонимов
В предложении 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, а реализовать для arrayJoin ленивое выполнение слишком сложно и затратно.
Последнее изменение 25 июня 2026 г.