使用 WITH-AS 子句进行更新

UPDATE with WITH-AS clause

当我 运行 以下脚本时,Original_TableUPDATE 语句更新

WITH temp AS (
    SELECT 
      ROW_NUMBER() over (partition by x order by y) row_num, x, z
    FROM Original_Table )

UPDATE temp set z = a + (select ISNULL(SUM(a),0) from temp A where A.x= temp.xand A.row_num < temp.row_num)

但是当我用以下内容替换 WITH 时

CREATE TABLE
    #temp
(
    row_num INT NOT NULL ,
    x INT   NOT NULL,
    a DECIMAL   NOT NULL ,
    z DECIMAL    NULL 
);

insert into #temp
    SELECT 
      ROW_NUMBER() over (partition by x order by y) row_num, x, z
    FROM Original_Table 

UPDATE temp set z = a + (select ISNULL(SUM(a),0) from temp A where A.x= temp.xand A.row_num < temp.row_num)

UPDATE 仅更新 #temp table 但不更新 Original_Table

这是为什么?

最后一句话

UPDATE temp
 set z = a + (select ISNULL(SUM(a),0)
               from temp A where A.x= temp.x
                and A.row_num < temp.row_num)

仅更新​​一些 table 名称 "temp"。引用 Original_Table

的语句中没有任何内容

第一个示例更新 temp,它基于通过 CTE 来自 Original_Table 的查询。更新 CTE 时更新基础 table。正如 here 所解释的那样,CTE 范围内 UPDATE 声明。

第二个示例查询 Original_Table 并将结果保存在 new table: #temp 中。然后更新临时 table 。没有 魔法记忆#temp 中的行与 Original_Table 中的行联系起来,你可能不想要一个。