SQL查询结果行合并需求:合并指定关联行并保留其余记录
SQL行合并:保留关联主行并合并字段
针对你要合并关联行的需求,这里提供一个基于CTE的SQL解决方案,逻辑清晰且易于适配你的表结构:
实现步骤
- 识别所有通过
parent_refill_transaction_id和parent_withdraw_transaction_id双向关联的行对(比如#4和#7),指定优先保留的主行(示例中用transaction_id更小的行作为主行,对应#4)。 - 对每对关联行,将主行的目标字段和关联行的目标字段合并到一条记录中。
- 合并处理后的关联记录与所有未关联的原始记录,得到最终结果。
示例SQL代码
WITH linked_pairs AS ( SELECT a.transaction_id AS main_id, b.transaction_id AS linked_id, -- 从主行(优先保留的行)取的字段 a.parent_refill_transaction_id, a.parent_withdraw_transaction_id, a.amount AS refill_amount, a.create_time AS refill_time, -- 从关联行取的字段 b.amount AS withdraw_amount, b.create_time AS withdraw_time FROM transaction_table a JOIN transaction_table b -- 双向关联匹配条件:A的提现父ID是B的ID,B的充值父ID是A的ID ON a.parent_withdraw_transaction_id = b.transaction_id AND b.parent_refill_transaction_id = a.transaction_id -- 确保每对关联行只处理一次,避免重复 AND a.transaction_id < b.transaction_id ), unlinked_rows AS ( SELECT * FROM transaction_table -- 排除所有关联对中的副行 WHERE transaction_id NOT IN (SELECT linked_id FROM linked_pairs) ) -- 合并处理后的关联行和未关联行 SELECT main_id AS transaction_id, parent_refill_transaction_id, parent_withdraw_transaction_id, refill_amount, withdraw_amount, refill_time, withdraw_time FROM linked_pairs UNION ALL SELECT * FROM unlinked_rows;
关键细节说明
- 关联规则:通过双向JOIN确保只有互相指向的行才会被判定为关联对,避免误匹配单向指向的行。
- 主行优先级:示例中用
a.transaction_id < b.transaction_id确定主行,如果你需要按其他规则(比如创建时间)选择主行,替换这个条件即可。 - 字段自定义:在
linked_pairsCTE里明确指定哪些字段取自主行、哪些取自关联行,完全可以根据你的需求调整字段列表。 - 未关联记录保留:
unlinked_rowsCTE筛选出所有不属于关联副行的记录,确保这些记录完整保留在结果中。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

