不使用游标填充 table 的 ID 列
Filling the ID column of a table NOT using a cursor
已创建和使用没有 ID 列的表,但现在需要 ID 列。 (经典)
我听说没有光标就可以完成所有事情。我只需要每一行都包含一个不同的 int
值,所以我在寻找某种行号函数:
How do I use ROW_NUMBER()?
即使有这些例子,我也不能确切地说出如何使用它。
UPDATE [TableA]
SET [id] = (select ROW_NUMBER() over (order by id) from [TableA])
Subquery returned more than 1 value.
所以...是的,当然它 return 不止一个值。那么如何混合更新和行号来填充该列?
PS。我不需要精确的顺序,只需要唯一的值。我也想知道 ROW_NUMBER() 在这种情况下是否合适...
您可以使用 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
已更新Table
ID SomeCol
1 Dog
2 Cat
3 Monkey
您也可以使用子查询作为
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
已创建和使用没有 ID 列的表,但现在需要 ID 列。 (经典)
我听说没有光标就可以完成所有事情。我只需要每一行都包含一个不同的 int
值,所以我在寻找某种行号函数:
How do I use ROW_NUMBER()?
即使有这些例子,我也不能确切地说出如何使用它。
UPDATE [TableA]
SET [id] = (select ROW_NUMBER() over (order by id) from [TableA])
Subquery returned more than 1 value.
所以...是的,当然它 return 不止一个值。那么如何混合更新和行号来填充该列?
PS。我不需要精确的顺序,只需要唯一的值。我也想知道 ROW_NUMBER() 在这种情况下是否合适...
您可以使用 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
已更新Table
ID SomeCol
1 Dog
2 Cat
3 Monkey
您也可以使用子查询作为
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