【问题标题】: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 有什么好主意?

标签: sql sql-server


【解决方案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];
    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2011-09-30
    • 2018-06-27
    • 2014-11-18
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多