PostgreSQL中jsonb cross join未返回N*M行的问题排查
问题原因解析
你对CROSS JOIN配合jsonb_array_elements的执行逻辑存在误解,核心差异点在于PostgreSQL的隐式LATERAL连接规则:
jsonb_array_elements(changes)作为集合返回函数(SRF),当入参直接引用了左侧mytable表的changes字段时,PostgreSQL会默认触发隐式LATERAL连接:不会先把所有行的changes数组元素汇总成一个4行的独立集合,而是逐行处理mytable的每条记录,仅拆解当前行的changes数组生成对应行数的结果:- id=1的行
changes数组长度为2,拆解后生成2行结果 - id=2的行
changes数组长度为2,拆解后生成2行结果
总计返回4行,属于正常执行结果。
- id=1的行
- 你预期的「2行原表 * 4个总元素 = 8行」的笛卡尔积结果,需要先把所有数组元素提取为独立的无关联结果集,再和原表做交叉连接,对应查询语句如下:
SELECT mytable.*, elems FROM mytable CROSS JOIN ( SELECT jsonb_array_elements(changes) AS elems FROM mytable ) AS all_elems ORDER BY mytable.id;
内容的提问来源于stack exchange,提问作者jian
相关产品推荐
相关产品推荐

