如何实现用user_settings覆盖default_settings对应字段并合并所有设置字段
需求说明
需要查询得到两类设置字段:
- 同时存在于
user_settings和default_settings中的字段,使用user_settings中的值 - 仅存在于
default_settings中的字段,保留其原有值
数据表结构
default_settings表
| field | value |
|---|---|
| Name | Test |
| Age | 21 |
| Sex | M |
| Dob |
user_settings表
| field | value |
|---|---|
| Name | Jack |
| Age | 40 |
预期结果
| field | value |
|---|---|
| Name | Jack |
| Age | 40 |
| Sex | M |
| Dob |
正确SQL语句
你当前的LEFT JOIN逻辑错误,应该以default_settings为主表,左连接user_settings,再通过COALESCE函数优先取用户自定义值,语句如下:
SELECT ds.field, COALESCE(us.value, ds.value) AS value FROM default_settings ds LEFT JOIN user_settings us ON ds.field = us.field;
语句解释
- 以
default_settings作为主表,确保所有默认设置字段都被纳入结果 LEFT JOIN按field字段关联user_settings,匹配用户的自定义设置记录COALESCE函数会返回传入参数中的第一个非空值,因此当用户有自定义设置时用us.value,无自定义设置时保留默认的ds.value
内容的提问来源于stack exchange,提问作者Fury
相关产品推荐
相关产品推荐

