【问题标题】:Filling the ID column of a table NOT using a cursor不使用游标填充表的 ID 列
【发布时间】:2019-05-15 01:21:13
【问题描述】:

已经创建并使用了没有 ID 列的表,但现在需要 ID 列。 (经典)

我听说一切都可以在没有光标的情况下完成。我只需要每一行都包含一个不同的int 值,所以我正在寻找某种行号函数:

How do I use ROW_NUMBER()?

即使有这些例子,我也无法确切地知道如何使用它。

UPDATE [TableA]
SET [id] = (select ROW_NUMBER() over (order by id) from [TableA])

子查询返回超过 1 个值。

所以...是的,它当然返回多个值。那么如何混合更新和行号来填充该列?

PS。我不需要精确的顺序,只需要唯一的值。我也想知道 ROW_NUMBER() 在这种情况下是否合适......

【问题讨论】:

  • 您需要一个 CTE 或一个子查询才能使用窗口函数
  • 为避免另一个经典问题,请使用BIGINT。我经历了其中的三个崩溃,试图追踪每个引用ID 字段的实例,在半夜ID 达到2,147,483,648 的压力下。我知道没有人认​​为它会永远变得那么大。直到它发生。

标签: sql-server pivot row-number


【解决方案1】:

您可以使用 CTE 进行更新

示例

Declare @TableA table (ID int,SomeCol varchar(50))
Insert Into @TableA values
 (null,'Dog')
,(null,'Cat')
,(null,'Monkey')

;with cte as ( 
      Select *
            ,RN = Row_Number() over(Order by (Select null))
      From  @TableA
)
Update cte set ID=RN

Select * from @TableA

更新表格

ID  SomeCol
1   Dog
2   Cat
3   Monkey

【讨论】:

  • @AntoinePelletier 总是乐于提供帮助 :)
【解决方案2】:

你也可以使用子查询

Declare @TableA table (ID int,SomeCol varchar(50))
Insert Into @TableA values
 (null,'Dog')
,(null,'Cat')
,(null,'Monkey');

UPDATE T1
SET T1.ID = T2.RN
FROM @TableA T1 JOIN
     (
       SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) RN,
              *
       FROM @TableA
     ) T2
ON T1.SomeCol = T2.SomeCol;


Select * from @TableA

【讨论】:

  • 因此您可以将表连接到自身。确实,这也有效。
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多