如何使用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
相关产品推荐
相关产品推荐

