5

我必须在 SQL Server 2005 的表中更新多行 (29)。

SELECT * from tblState ORDER BY StateCode ASC. 

在这个表中有一个整数列,我需要分配从 1 到 29 的数字。例如

BEFORE

A 3 

B 6

C 2 
D 1 

AFTER

A 1  
B 2  
C 3  
D 4

如何有效地使用升序号更新每一行?

4

6 回答 6

5
WITH
  sequenced_data AS
(
  SELECT
    ROW_NUMBER() OVER (ORDER BY StateCode ASC) AS sequence_id,
    *
  FROM
    tblState
)
UPDATE
  sequenced_data
SET
  integer_column = sequence_id

当您要求循环时,我猜您可能不理解此代码。

因此,我强烈建议您创建一个虚拟表来玩这个,既要了解它的工作原理,又要确保它符合您的要求/期望。

  • WITH语句类似于子查询
  • 在那,ROW_NUMBER()创建你想要的顺序ID
  • 外部查询然后更新列(虽然它引用了子查询,但真正的表确实得到了更新)
于 2012-10-10T09:42:43.743 回答
2

您应该尽可能避免 SQL 中的循环。SQL Server 针对基于集合的操作进行了大量优化。

在这种情况下,您可以使用CTEwithROW_NUMBER函数:

WITH CTE AS
(
   SELECT StateCode, IntColumn
   ,  RN = ROW_NUMBER() OVER (ORDER BY StateCode ASC)
   FROM dbo.tblState
)
UPDATE CTE SET IntColumn = RN;

要踢的坏习惯:认为 WHILE 循环不是 CURSOR

于 2012-10-10T09:42:48.180 回答
0

试试这个:

with CTE1 as(select StateCode,intcol,ROW_NUMBER() over (order by StateCode) as rn from tbln)
update CTE1 set intcol=rn
select * from tbln
于 2012-10-10T09:47:37.393 回答
0

您可以使用公用表表达式

with c as
(
    select ID, ROW_NUMBER() 
    over (order by StateCode ASC) as cn 
    from tblState 
)
update c set ID = cn
于 2012-10-10T09:49:27.977 回答
0

好的,不要将数字存储在表中,因为每次插入新行时都必须更改它。

做就是了

SELECT
                ROW_NUMBER() OVER (ORDER BY StateCode ASC) sequence_id
              , *   
    FROM 
              tblState

每次你把数据拿出来。

如果您有很多行并且需要快速执行此操作,请在StateCode ASC

于 2012-10-10T09:55:45.280 回答
0

我没有 cte 的选择:

UPDATE d
SET d.integer_column = d.sequence_id
FROM (
      SELECT integer_column, ROW_NUMBER() OVER (ORDER BY StateCode ASC) AS sequence_id 
      FROM dbo.tblState
      ) d 
于 2012-10-10T10:20:35.737 回答