You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:54:03