在SQL中重新编号表的子集

时间:2013-05-16 08:05:17

标签: sql azure

我有一个包含以下列的表:ComponentID,PartID,Position,Country和City。主键由ComponentID,PartID,Country和City组成。

我正在使用MS SQL Azure。

潜在的"部分"可能会被删除。如果发生这种情况,我需要能够重置组件和部件的所有位置,但是按国家和城市划分。

我已编写下面的代码,但它会抛出主键错误。有人可以帮忙吗?

-- Update the positions 
;WITH CTE AS
    (
            SELECT Comp.Position,
               RowNum = row_number() OVER (partition by Comp.Country, Comp.City order by Comp.Position ASC)
            FROM Comp
        WHERE Comp.CompID = @selectedComponent
    )
UPDATE CTE 
SET Position = RowNum

1 个答案:

答案 0 :(得分:1)

您的CTE正在为您的数据生成新的行位置,因此您需要将其加入现有表格以更新位置值。

为此,您需要在CTE中包含所有主键列,然后对连接进行更新:

UPDATE dbo.Comp 
    SET Position = CTE.RowNum
    FROM CTE
    INNER JOIN DBO.Comp ON   CTE.ComponentId  = dbo.Comp.ComponentId
    AND CTE.City = dbo.Comp.City AND CTE.Country = dbo.Comp.Country AND CTE.PartID = dbo.Comp.PartID