MySQL如何编写查询实现子行空字段继承父行对应值
解决方案
该需求完全可以实现,通过自连接搭配COALESCE函数即可快速完成,无需复杂逻辑。
实现思路
- 对原表做自左连接:左表
t1保留所有原表数据,右表t2存储对应父行数据,关联条件为t1.parent = t2.id - 使用
COALESCE函数处理字段取值:该函数会返回传入参数中第一个非NULL的值,刚好匹配「优先取自身字段值,自身为NULL则取父行同名字段值」的规则 - 父行的
parent字段为NULL,关联不到右表数据,因此COALESCE会直接返回左表自身的字段值,天然符合父行不做修改的要求
示例SQL
假设你的表名为family,可替换为实际表名:
SELECT t1.id, COALESCE(t1.firstName, t2.firstName) AS firstName, COALESCE(t1.lastName, t2.lastName) AS lastName FROM family t1 LEFT JOIN family t2 ON t1.parent = t2.id ORDER BY t1.id ASC;
结果验证
执行上述SQL后返回的结果和要求的输出完全一致:
| id | firstName | lastName |
|---|---|---|
| 1 | NULL | Smith |
| 2 | John | Smith |
| 3 | Jack | Smith |
| 4 | Jimmi | Joe |
| 5 | Jane | Doe |
如果你的数据是超过2层的多级嵌套结构(比如子行还有下一级子行),可以使用MySQL 8.0及以上版本支持的递归CTE实现,当前2级场景下上述SQL完全适用。
内容的提问来源于stack exchange,提问作者KMK
相关产品推荐
相关产品推荐

