如何将同一张SQL表中指定列的特定单元格映射到该列其他指定单元格
同表指定行批量替换列值的正确SQL写法
你原有写法的核心问题是两个子查询没有配置对应映射关系,会产生笛卡尔积,无法实现「id1取id3的值、id2取id5的值」的精准匹配需求。以下是两种可直接运行的实现方案:
通用兼容写法(所有关系型数据库均支持)
通过CASE WHEN加子查询实现,逻辑直观,适合映射对较少的场景:
UPDATE Book SET payload = CASE id WHEN 1 THEN (SELECT payload FROM Book WHERE id = 3) WHEN 2 THEN (SELECT payload FROM Book WHERE id = 5) -- 更多映射对直接加WHEN分支即可 ELSE payload END WHERE id IN (1,2);
仅会修改id为1、2的行,不会影响其他数据,安全性高。
批量映射友好写法(支持UPDATE JOIN的数据库,如MySQL、PostgreSQL 12+)
如果需要替换的映射对较多,可以先构造映射关系派生表再关联更新:
UPDATE Book target JOIN ( -- 这里维护目标id和源id的对应关系 SELECT 1 AS target_id, 3 AS source_id UNION ALL SELECT 2 AS target_id, 5 AS source_id ) AS mapping ON target.id = mapping.target_id JOIN Book source ON source.id = mapping.source_id SET target.payload = source.payload;
新增映射对时只需在mapping派生表中新增对应UNION ALL行即可,无需修改其他逻辑。
内容的提问来源于stack exchange,提问作者Lester Dela Cruz
相关产品推荐
相关产品推荐

