arrayJoin 函数则会将每一行展开为一组行 (unfold) 。
该函数接受一个数组作为参数,并根据数组中的元素个数,将源行扩展成多行。
各列中的所有值都会被直接复制,只有应用此函数的那一列例外;该列的值会被替换为对应的数组元素值。
如果数组为空,
arrayJoin 不会生成任何行。
若要返回仅包含数组类型默认值的一行,可以用 emptyArrayToSingle 对其进行包装,例如:arrayJoin(emptyArrayToSingle(...))。Query
Response
arrayJoin 函数会影响查询的所有部分,包括 WHERE 子句。请注意,下面这个查询的结果是 2,尽管子查询只返回了 1 行。
Query
Response
arrayJoin 函数。在这种情况下,转换会执行多次,行会成倍增加。
例如:
Query
Response
最佳实践
arrayJoin,由于公共子表达式消除,可能无法得到预期结果。
在这种情况下,可以考虑对重复的数组表达式做一些不会影响 JOIN result 的额外处理。例如,arrayJoin(arraySort(arr))、arrayJoin(arrayConcat(arr, []))
示例:
Query
ARRAY JOIN 语法,它提供了更多可能性。
ARRAY JOIN 允许你一次同时转换多个元素数量相同的数组。
示例:
Query
Response
Tuple
示例:
Query
Row
arrayJoin 这一名称源于它在概念上与 JOIN 操作相似,但它是应用于单行内部的数组。传统的 JOIN 会组合来自不同表的行,而 arrayJoin 则会将一行中数组里的每个元素“连接”出来,生成多行——每个数组元素对应一行——同时复制其他列的值。ClickHouse 还提供了 ARRAY JOIN 子句语法,通过使用熟悉的 SQL JOIN 术语,使这种与传统 JOIN 操作的关系更加直观。这个过程也称为对数组进行“展开”,但在函数名和子句中都使用了“join”一词,因为它类似于将表与数组元素进行连接,从而以类似 JOIN 操作的方式有效扩展数据集。