这个CTE更新如何工作?

时间:2017-09-27 15:25:29

标签: sql-server tsql common-table-expression

我有这些表格:

ID (PK)
ItemName

ItemsCategoryLink

ItemID (FK)
CatID
ItemOrder

对于链接表中的每个CatID,我可以设置项目的显示顺序。 现在,我想根据ItemOrder

更新Items.ItemName

这次CTE更新:

;WITH cteUpdate AS 
(
    SELECT 
        Items.ItemName,
        ItemsCategoryLink.ItemOrder, 
        ROW_NUMBER() OVER(ORDER BY Items.ItemName DESC) AS NewItemOrder
    FROM 
        Items 
    INNER JOIN
        ItemsCategoryLink ON Items.ID = ItemsCategoryLink.ItemID
    WHERE 
        ItemsCategoryLink.CatID = '{390510E6-765B-4E5D-989F-F13B259FF1D2}'
)
UPDATE cteUpdate 
SET ItemOrder = NewItemOrder

令我惊讶的是,这正确地更新了基础ItemsCategoryLink.ItemOrder。我没有在CTE中选择任何PK。

这是如何运作的?更新CTE如何更新底层表?更新CTE是否依赖于主键,因此它知道要更新哪些行?

请建议。

0 个答案:

没有答案