SQL如何基于按id排序的下一行val值更新当前行val字段
修复方案
核心问题为不同数据库的UPDATE关联语法存在差异,你的原写法符合SQL Server/PostgreSQL的部分语法规范,但细节需要调整,同时需要注意LEAD函数返回的最后一行下一个值为NULL的场景,可按需选择是否过滤该场景。
MySQL 写法
MySQL不支持UPDATE ... FROM的语法,需要直接关联表:
UPDATE ssc t1 INNER JOIN ( SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val FROM ssc ) t2 ON t1.id = t2.id SET t1.val = t2.next_val;
如果不想让最后一行的val被更新为NULL,可以加过滤条件:
UPDATE ssc t1 INNER JOIN ( SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val FROM ssc ) t2 ON t1.id = t2.id SET t1.val = t2.next_val WHERE t2.next_val IS NOT NULL;
SQL Server 写法
原写法结构正确,调整字段别名避免歧义即可:
UPDATE t SET t.val = t2.next_val FROM ssc t INNER JOIN ( SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val FROM ssc ) t2 ON t.id = t2.id WHERE t2.next_val IS NOT NULL; -- 不需要更新最后一行就保留该条件,否则删除
PostgreSQL 写法
支持UPDATE ... FROM语法,写法如下:
UPDATE ssc t SET val = t2.next_val FROM ( SELECT id, LEAD(val) OVER(ORDER BY id) AS next_val FROM ssc ) t2 WHERE t.id = t2.id AND t2.next_val IS NOT NULL; -- 不需要更新最后一行就保留该条件,否则删除
效果验证
以你提供的样例数据为例,加了最后一行过滤条件的更新结果如下:
| id | val | dt |
|---|---|---|
| 1 | k | 2021-01-01 |
| 3 | k2 | 2021-05-15 |
| 5 | k2 | 2021-10-11 |
内容的提问来源于stack exchange,提问作者Karan Alang
相关产品推荐
相关产品推荐

