使用行号更新列
Posted
技术标签:
【中文标题】使用行号更新列【英文标题】:Update Column with row number 【发布时间】:2013-12-04 00:47:02 【问题描述】:我在 SQL Server 存储过程中有一个带有 Id 和日期列的临时表。该表已经填充了日期,我希望能够根据升序的日期在 id 列中添加一个序列号
我已经尝试了以下
UPDATE #Weeks
SET Id = (
SELECT ROW_NUMBER() OVER (ORDER BY WeekDate ASC) AS Id
FROM #Weeks AS DATA);
并得到这个错误。
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
感谢任何帮助。
这对我有用.....
更新#Weeks SET Id = tab.Id 来自#Weeks w 内部联接 ( 选择星期日期, ROW_NUMBER() OVER (ORDER BY WeekDate ASC) 作为 Id FROM #Weeks ) 标签打开 w.WeekDate = Tab.WeekDate
【问题讨论】:
用行号更新列 ?这不是个好主意! @mehdi 有什么好主意? 【参考方案1】:试试这个:
UPDATE #Weeks
SET Id = Tab.Id
FROM #Week w
INNER JOIN (
SELECT Id,
ROW_NUMBER() OVER (ORDER BY WeekDate ASC) AS Id
FROM #Weeks ) Tab ON w.Id = Tab.Id
由于子查询返回多行,而=操作符只针对一行。
【讨论】:
更新#Weeks SET Id = tab.Id FROM #Weeks w INNER JOIN (SELECT WeekDate, ROW_NUMBER() OVER (ORDER BY WeekDate ASC) AS Id FROM #Weeks) 标签上 w.WeekDate = Tab .WeekDate 我已经编辑了原始问题并发布了对我有用的答案....hawk 为我指明了正确的方向,再次感谢 @realnumber3012 不是复制过去,只是缺少一个字符。【参考方案2】: UPDATE #Weeks
SET Id = t.Id1
FROM #Week w
INNER JOIN
(
SELECT Id, ROW_NUMBER() OVER (ORDER BY WeekDate ASC) AS Id1
FROM #Weeks ) T ON w.Id = t.Id
【讨论】:
【参考方案3】:试试这个
;with cte as
(
SELECT Id,ROW_NUMBER() OVER (ORDER BY WeekDate ASC) AS DATA FROM #Weeks
)
UPDATE #Weeks SET Id=DATA from cte
【讨论】:
试一试!! 我认为这是一个很好的方向。但是,我会这样写: ;WITH CTE AS ( SELECT WeekDate, ROW_NUMBER() OVER (ORDER BY WeekDate ASC) AS NewId FROM #Weeks ) UPDATE [UPDATEWeeks] SET [UPDATEWeeks].[Id] = CTE.[NewId ] FROM #Weeks AS [UPDATEWeeks] INNER JOIN CTE ON CTE.[WeekDate] = [UPDATEWeeks].[WeekDate];以上是关于使用行号更新列的主要内容,如果未能解决你的问题,请参考以下文章
将行号列添加到绑定到 DataTable 的 DataGridView
基于行和列位置的 SQL UPDATE 值,没有 ID 或键