ARRAY JOIN.
Название связано с тем, что его можно рассматривать как выполнение JOIN с массивом или вложенной структурой данных. По назначению оно похоже на функцию arrayJoin, но возможности предложения шире.
PostgreSQL
FROM unnest(...), CROSS JOIN UNNEST(...) и LATERAL не поддерживаются. Используйте вместо них ARRAY JOIN. Имя unnest (начиная с версии 26.5) является псевдонимом вызова функции arrayJoin (SELECT unnest(arr)), а не табличной функцией.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. Пример:
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 выполняется по ним одновременно (прямая сумма, а не декартово произведение). Обратите внимание, что по умолчанию все массивы должны быть одинакового размера. Пример:
SETTINGS enable_unaligned_array_join = 1. Пример:
ARRAY JOIN со вложенной структурой данных
ARRAY JOIN также работает с вложенными структурами данных:
ARRAY JOIN смысл такой же, как у ARRAY JOIN со всеми элементами массивов, из которых они состоят. Примеры приведены ниже:
JOIN, либо исходный массив. Пример:
Подробности реализации
ARRAY JOIN оптимизируется. Хотя в запросе ARRAY JOIN всегда должен указываться перед оператором WHERE/PREWHERE, технически эти операции могут выполняться в любом порядке, если только результат ARRAY JOIN не используется для фильтрации. Порядок выполнения контролируется оптимизатором запросов.
Несовместимость с вычислением функций с коротким замыканием
if, multiIf, and и or. Она позволяет избежать потенциальных исключений, например деления на ноль, при выполнении этих функций.
arrayJoin выполняется всегда и не поддерживает вычисление функций с коротким замыканием. Это связано с тем, что arrayJoin — особая функция, которая при анализе и выполнении запроса обрабатывается отдельно от всех остальных и требует дополнительной логики, несовместимой с таким режимом выполнения. Причина в том, что число строк в результате зависит от результата arrayJoin, а реализовать для arrayJoin ленивое выполнение слишком сложно и затратно.