我在 MS SQL 中有一个非常旧的表,它没有任何主键。它的结构是:
- 文档
- 位置
- 材料
- 数量
- ..
我想改变它,并将“文档”和“位置”作为表格的键。当然,每个组合都应该是独一无二的。对于新记录,这已经完成,但对于旧记录,“位置”字段丢失。
我想要做的是更新任何现有记录,其中位置为 NULL 并带有递增数字(每次更改文档更改时,计数器应重新从 1 开始)
为了快速做到这一点,TSQL 语句应该是什么?
谢谢IT
我在 MS SQL 中有一个非常旧的表,它没有任何主键。它的结构是:
我想改变它,并将“文档”和“位置”作为表格的键。当然,每个组合都应该是独一无二的。对于新记录,这已经完成,但对于旧记录,“位置”字段丢失。
我想要做的是更新任何现有记录,其中位置为 NULL 并带有递增数字(每次更改文档更改时,计数器应重新从 1 开始)
为了快速做到这一点,TSQL 语句应该是什么?
谢谢IT
您可以使用 aCTE
和排名功能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
. 这是公用表表达式 (CTE) 的好处之一。