Клауза 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
.