如何按Name列字母序更新MyHits表的Sequence列?
解决方案
要实现按Name列字母顺序设置Sequence列的值,且不使用游标,可以利用窗口函数ROW_NUMBER()生成排序后的序号,再通过关联更新完成赋值。以下是适用于主流关系型数据库(如SQL Server、MySQL 8.0+、PostgreSQL等)的SQL语句:
方法一:使用公共表表达式(CTE)
WITH RankedNames AS ( SELECT Name, ROW_NUMBER() OVER (ORDER BY Name) AS NewSequence FROM MyHits ) UPDATE MyHits SET Sequence = rn.NewSequence FROM MyHits h INNER JOIN RankedNames rn ON h.Name = rn.Name;
方法二:使用子查询关联更新(适用于MySQL)
UPDATE MyHits h INNER JOIN ( SELECT Name, ROW_NUMBER() OVER (ORDER BY Name) AS NewSequence FROM MyHits ) rn ON h.Name = rn.Name SET h.Sequence = rn.NewSequence;
说明
ROW_NUMBER() OVER (ORDER BY Name)会按照Name列的字母升序生成连续的序号,恰好对应需求中Sequence列的目标值:Ana对应1,Dan对应2,Len对应3。- 因为
Name列无重复值,所以通过Name关联原表和排序后的数据集可以准确完成更新。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

