map).
Агрегатные функции сжимают набор строк (fold или reduce).
Функция arrayJoin берёт каждую строку и порождает набор строк (unfold).
Эта функция принимает массив в качестве аргумента и разворачивает исходную строку в несколько строк — по числу элементов массива.
Все значения в столбцах просто копируются, кроме значений в столбце, к которому применяется эта функция: они заменяются соответствующим значением из массива.
Если массив пуст,
arrayJoin не создаёт ни одной строки.
Чтобы вернуть одну строку, содержащую значение по умолчанию для типа массива, можно обернуть массив в emptyArrayToSingle, например: arrayJoin(emptyArrayToSingle(...)).Query
Response
arrayJoin влияет на все части запроса, включая раздел WHERE. Обратите внимание, что результат запроса ниже — 2, хотя подзапрос вернул 1 строку.
Query
Response
arrayJoin, в том числе через его псевдоним unnest, нельзя использовать в условии JOIN ON, которое вычисляется в ходе JOIN, поскольку такое условие должно сохранять количество строк и вычисляется отдельно для каждого батча объединяемых строк. Условие, применяемое только к одной стороне, и ключ равенства по arrayJoin извлекаются до JOIN и не затрагиваются. Недизъюнктивное условие ALL INNER JOIN также не затрагивается, поскольку в этом случае условие применяется после JOIN. Если разворачивание зависит только от одной стороны, перенесите его в ARRAY JOIN в подзапросе перед JOIN; условие, аргумент arrayJoin которого использует столбцы с обеих сторон, необходимо переработать.
Запрос может использовать несколько функций arrayJoin. В этом случае преобразование выполняется несколько раз, а количество строк увеличивается.
Например:
Query
Response
Рекомендация
arrayJoin с одним и тем же выражением может не дать ожидаемого результата из-за устранения общих подвыражений.
В таких случаях попробуйте изменить повторяющиеся выражения массива, добавив дополнительные операции, которые не влияют на результат JOIN. Например, arrayJoin(arraySort(arr)), arrayJoin(arrayConcat(arr, []))
Пример:
Query
ARRAY JOIN в SELECT-запросе: он даёт больше возможностей.
ARRAY JOIN позволяет одновременно преобразовывать несколько массивов с одинаковым числом элементов.
Пример:
Query
Response
Tuple
Пример:
Query
Row
arrayJoin в ClickHouse связано с его концептуальным сходством с операцией JOIN, но применительно к массивам в пределах одной строки. Если традиционные JOIN объединяют строки из разных таблиц, то arrayJoin «соединяет» каждый элемент массива в строке, создавая несколько строк — по одной на каждый элемент массива — и при этом дублируя значения остальных столбцов. В ClickHouse также есть синтаксис оператора ARRAY JOIN, который делает эту связь с традиционными операциями JOIN ещё более очевидной благодаря использованию привычной терминологии SQL JOIN. Этот процесс также называют «разворачиванием» массива, но термин «join» используется и в имени функции, и в операторе, потому что по сути это похоже на соединение таблицы с элементами массива, то есть на расширение набора данных способом, схожим с операцией JOIN.