PostgreSQL查询同列名两表按generation匹配并排展示按parent升序实现方案
实现方案
你的原始查询产生笛卡尔积的核心原因是:同一个generation值下两张表都存在多条记录,仅用generation字段关联会触发一对多匹配,导致行数膨胀。
正确的实现思路是给同分组内的行增加顺序编号,关联时同时匹配分组和编号,具体SQL如下:
WITH t1_rn AS ( SELECT generation, parent, -- 按generation分组,组内按parent升序编排行号 ROW_NUMBER() OVER (PARTITION BY generation ORDER BY parent ASC) AS rn FROM table1 ), t2_rn AS ( SELECT generation, parent, -- 同样按generation分组,组内按parent升序编排行号 ROW_NUMBER() OVER (PARTITION BY generation ORDER BY parent ASC) AS rn FROM table2 ) SELECT t1.generation AS table1_generation, t1.parent AS table1_parent, t2.generation AS table2_generation, t2.parent AS table2_parent FROM t1_rn t1 -- 同时匹配generation和组内行号,保证不会多出行 LEFT JOIN t2_rn t2 ON t1.generation = t2.generation AND t1.rn = t2.rn -- 最终结果按table1的排序规则输出 ORDER BY t1.generation, t1.parent ASC;
执行上述语句返回的结果和你给出的期望输出完全一致:
- 当table1某个generation分组内的行数多于table2同分组的行数时,多余的行table2字段自动补空
- 最终总行数和table1的行数完全一致
- 两张表的行都是按组内parent升序对齐
内容的提问来源于stack exchange,提问作者skynet1010
相关产品推荐
相关产品推荐

