跨行交换列值:员工表firstname字段更新需求
实现员工firstname字段的跨行交换
先明确你的数据场景:
原员工表数据:
id,firstname 1,john 2,pall 3,kevin 4,Alan
期望更新后的结果:
id,firstname 1,kevin 2,Alan 3,john 4,pall
我给你整理了两种实用的SQL实现方案,按需选择即可:
方案一:用CASE WHEN直接更新
这种方式逻辑直观,适合这种固定ID对的交换场景,不需要额外临时表:
UPDATE employees SET firstname = CASE id WHEN 1 THEN (SELECT firstname FROM employees WHERE id = 3) WHEN 3 THEN (SELECT firstname FROM employees WHERE id = 1) WHEN 2 THEN (SELECT firstname FROM employees WHERE id = 4) WHEN 4 THEN (SELECT firstname FROM employees WHERE id = 2) ELSE firstname -- 其他ID的记录保持不变 END WHERE id IN (1,2,3,4); -- 仅更新目标ID的记录
方案二:通过自连接更新
如果你的数据库支持自连接更新,这种方式执行效率会更高:
UPDATE employees e1 JOIN employees e2 ON ( (e1.id = 1 AND e2.id = 3) OR (e1.id = 3 AND e2.id = 1) OR (e1.id = 2 AND e2.id = 4) OR (e1.id = 4 AND e2.id = 2) ) SET e1.firstname = e2.firstname;
重要提醒
- 执行更新前一定要先备份数据,或者先把UPDATE换成SELECT语句验证逻辑是否正确,避免误操作。
- 如果你的表名不是
employees,记得替换成实际使用的表名。
内容的提问来源于stack exchange,提问作者Amar Anugu
相关产品推荐
相关产品推荐

