我在MS SQL中有一个非常旧的表,它没有任何主键。 其结构是:
我想改变它,并将“DOcument”和“Position”作为表格的键。当然,每种组合都应该是独特的。对于新记录,这已经完成,但对于旧记录,缺少“位置”字段。
我想要做的是对任何现有记录进行UPDATE,其中Position为NULL,并带有递增数字(每次更改Document更改时,计数器应该从1开始重新开始)
为了快速做到这一点,TSQL句子应该是什么?
谢谢你
答案 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)的好处之一。