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

Оператор 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 слишком сложно и затратное.