You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询获取父键及其关联键?附示例表与规则

嘿,我来帮你搞定这个SQL需求!先理清楚你的场景,再给你两种实用的解法~

问题回顾

给定表 Table1:

MBR_KEYRCDSID
AAA1812
BBB1912
CCC1813

规则要求:

  • 当 RCD = 18 时,SKEY 直接取当前记录的 MBR_KEY;
  • 当 RCD ≠ 18 时,匹配同 SID 下 RCD = 18 的父记录,把父记录的 MBR_KEY 作为 SKEY。

期望输出:

mbrr_keyskey
AAAAAA
BBBAAA
CCCCCC

解法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:48