Конструкция 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
.