如何编写SQL查询获取父键及其关联键?附示例表与规则
嘿,我来帮你搞定这个SQL需求!先理清楚你的场景,再给你两种实用的解法~
问题回顾
给定表 Table1:
| MBR_KEY | RCD | SID |
|---|---|---|
| AAA | 18 | 12 |
| BBB | 19 | 12 |
| CCC | 18 | 13 |
规则要求:
- 当
RCD = 18时,SKEY直接取当前记录的MBR_KEY; - 当
RCD ≠ 18时,匹配同SID下RCD = 18的父记录,把父记录的MBR_KEY作为SKEY。
期望输出:
| mbrr_key | skey |
|---|---|
| AAA | AAA |
| BBB | AAA |
| CCC | CCC |
解法1:自连接(兼容绝大多数数据库)
这种方法通过表自连接匹配同SID下的父记录,适用性最广:
SELECT t1.MBR_KEY AS mbrr_key, COALESCE(t2.MBR_KEY, t1.MBR_KEY) AS skey FROM Table1 t1 LEFT JOIN Table1 t2 ON t1.SID = t2.SID AND t2.RCD = 18;
逻辑解释:
LEFT JOIN保证原表所有记录都被保留,不会因为找不到父键而丢失数据;- 连接条件锁定同
SID且RCD=18的记录,精准定位父键; COALESCE函数做兜底:如果找到父键就用它,找不到(也就是当前记录RCD=18的情况)就用自己的MBR_KEY。
解法2:窗口函数(适合支持窗口函数的数据库,如MySQL 8+、PostgreSQL、SQL Server等)
如果你的数据库支持窗口函数,这个写法更简洁高效:
SELECT MBR_KEY AS mbrr_key, MAX(CASE WHEN RCD = 18 THEN MBR_KEY END) OVER (PARTITION BY SID) AS skey FROM Table1;
逻辑解释:
PARTITION BY SID按SID分组,把同SID的记录归为一组;CASE WHEN只筛选组内RCD=18的记录的MBR_KEY,其他记录对应位置为NULL;MAX()函数会在每组中自动取非NULL的那个值(也就是父键),而RCD=18的记录本身就是组内的有效值,所以结果完全符合要求。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

