Перейти к основному содержимому
Перейти к основному содержимому

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