如何为亲子关系表添加家庭编号
为亲子关系表添加家庭编号的解决方案
嘿,我来帮你搞定这个家庭编号的问题!核心思路很清晰:每个家族的根节点(就是level=1、父亲为空的成员)对应唯一的家庭编号,所有后代直接继承这个编号——毕竟你已经用数字ID代替姓名,完全不用担心同名混淆的问题。
具体操作步骤
1. 给根节点分配初始家庭编号
首先处理所有level=1且father=NA的成员,给他们分配独一无二的家庭编号,比如从F1、F2开始:
- 假设
Guillou Arthur的数字ID是1,家庭编号设为F1 - 假设
Cleach Marc的数字ID是2,家庭编号设为F2
2. 让后代继承家庭编号
对于所有非根节点(level>1),只需要找到他们父亲对应的家庭编号,直接复用就行。举几个例子:
Guillou Eric(ID3)的父亲是ID1,所以家庭编号跟着用F1Cleach Franck(ID4)的父亲是ID2,家庭编号就是F2Cleach Herbet(ID7)的父亲是Cleach Leo(ID6),而ID6的家庭编号是F2,所以ID7也用F2
处理后的最终数据示例(用数字ID展示)
| person_id | father_id | level | family_id |
|---|---|---|---|
| 1 | NA | 1 | F1 |
| 2 | NA | 1 | F2 |
| 3 | 1 | 2 | F1 |
| 4 | 1 | 2 | F1 |
| 5 | 2 | 2 | F2 |
| 6 | 2 | 2 | F2 |
| 7 | 6 | 3 | F2 |
| 8 | 7 | 4 | F2 |
| 9 | 3 | 3 | F1 |
批量实现的SQL示例
如果用SQL来自动化处理,这两步就能搞定:
- 先给根节点赋值家庭编号:
UPDATE family_relations SET family_id = CONCAT('F', person_id) WHERE level = 1 AND father IS NULL;
- 用递归CTE更新所有后代的家庭编号:
WITH RECURSIVE family_tree AS ( SELECT person_id, father_id, family_id FROM family_relations WHERE level = 1 AND father IS NULL UNION ALL SELECT fr.person_id, fr.father_id, ft.family_id FROM family_relations fr JOIN family_tree ft ON fr.father_id = ft.person_id ) UPDATE family_relations fr SET family_id = ft.family_id FROM family_tree ft WHERE fr.person_id = ft.person_id;
不管你的家族树有多少层,这个递归方法都能轻松遍历所有成员,准确分配家庭编号。
内容的提问来源于stack exchange,提问作者Wilcar
相关产品推荐
相关产品推荐

