使用行号更新列

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

使用显式游标和循环更新列以生成唯一值

使用列号和行号进行 UNPIVOT 和 JOIN

基于行和列位置的 SQL UPDATE 值,没有 ID 或键

如何使用窗口函数根据奇偶行号过滤掉结果,没有现有列作为行ID

pythonexcel自动更新行号