TSQL:如何使用外键更新每条记录

时间:2013-10-07 11:28:15

标签: tsql sql-update primary-key

我在MS SQL中有一个非常旧的表,它没有任何主键。 其结构是:

  • 文档
  • 位置
  • 材料
  • 数量
  • ..

我想改变它,并将“DOcument”和“Position”作为表格的键。当然,每种组合都应该是独特的。对于新记录,这已经完成,但对于旧记录,缺少“位置”字段。

我想要做的是对任何现有记录进行UPDATE,其中Position为NULL,并带有递增数字(每次更改Document更改时,计数器应该从1开始重新开始)

为了快速做到这一点,TSQL句子应该是什么?

谢谢你

1 个答案:

答案 0 :(得分:2)

您可以使用CTE和排名函数ROW_NUMBER

WITH CTE AS(
    SELECT Document, Position, Material, Quantity,
        RN = ROW_NUMBER() OVER (PARTITION BY Document ORDER BY Document ASC)
    FROM dbo.TableName
)
UPDATE CTE SET POSITION = RN
WHERE Position IS NULL

如果您需要将订单更改ORDER BY Document ASC的特定逻辑更改为有意义的内容。

如果您想查看要更新的内容,只需将更新更改为SELECT * FROM CTE WHERE Position IS NULL即可。这是common-table-expression(CTE)的好处之一。