CROSS JOIN LATERAL 是SQL中的一种特殊连接方式,让我详细解释:
CROSS JOIN LATERAL 的组成
1. CROSS JOIN(笛卡尔积)
- 将左表的每一行与右表的每一行进行组合
- 如果左表有3行,右表有2行,结果是6行
2. LATERAL(横向连接)
- 允许右侧的表达式引用左侧表的列
- 右侧的表达式会对左侧的每一行分别执行
工作原理
-- 普通 CROSS JOIN(不能引用左表的列)
SELECT * FROM table1
CROSS JOIN (SELECT * FROM table2) -- ❌ 这里不能引用 table1 的列
-- CROSS JOIN LATERAL(可以引用左表的列)
SELECT * FROM table1
CROSS JOIN LATERAL (SELECT * FROM table2 WHERE table2.id = table1.id) -- ✅ 可以引用
栗子🌰
FROM dwd_voc_voice_detail
CROSS JOIN LATERAL unnest(split(tags, ',')) AS t(tag)
这里的执行过程:
- 对于dwd_voc_voice_detail表的每一行
- 执行unnest(split(tags, ',')),其中tags来自当前行
- 将拆分后的结果与原始行进行连接
假设原始数据:
id | brand | tags
---+-------+----------------
1 | DREO | 'good,cheap,fast'
2 | DREO | 'quality,service'
执行后的结果:
id | brand | tag
---+-------+--------
1 | DREO | good
1 | DREO | cheap
1 | DREO | fast
2 | DREO | quality
2 | DREO | service
