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

如何使用SQL基于多关联表为Main表新增doc_val计算列

实现方案

方案1:左连接+COALESCE(推荐,全数据库兼容,性能最优)

思路:分别将Main表与A、B、C三张业务表做左连接,连接条件同时匹配doc_type标识和doc_id与对应表的id,最后用COALESCE函数取唯一非空的val值作为doc_val。
查询代码如下:

SELECT 
    m.id,
    m.doc_type,
    m.doc_id,
    COALESCE(a.val, b.val, c.val) AS doc_val
FROM Main m
LEFT JOIN A a 
    ON m.doc_type = 'doc_a' AND m.doc_id = a.id
LEFT JOIN B b 
    ON m.doc_type = 'doc_b' AND m.doc_id = b.id
LEFT JOIN C c 
    ON m.doc_type = 'doc_c' AND m.doc_id = c.id
ORDER BY m.id;

如果需要直接给Main表新增doc_val列并回填数据,执行以下语句:

-- 新增doc_val列,字段类型和业务表的val字段保持一致即可
ALTER TABLE Main ADD COLUMN doc_val INT;

-- 回填所有行的doc_val值
UPDATE Main m
LEFT JOIN A a ON m.doc_type = 'doc_a' AND m.doc_id = a.id
LEFT JOIN B b ON m.doc_type = 'doc_b' AND m.doc_id = b.id
LEFT JOIN C c ON m.doc_type = 'doc_c' AND m.doc_id = c.id
SET m.doc_val = COALESCE(a.val, b.val, c.val);

方案2:CASE WHEN子查询(写法简洁,适合小数据量场景)

如果数据量较小,也可以用子查询的写法实现:

SELECT 
    id,
    doc_type,
    doc_id,
    CASE doc_type
        WHEN 'doc_a' THEN (SELECT val FROM A WHERE id = doc_id)
        WHEN 'doc_b' THEN (SELECT val FROM B WHERE id = doc_id)
        WHEN 'doc_c' THEN (SELECT val FROM C WHERE id = doc_id)
    END AS doc_val
FROM Main
ORDER BY id;

内容的提问来源于stack exchange,提问作者user8730776

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 06:24:02