使用WITH-AS子句更新

时间:2016-12-06 17:11:19

标签: sql-server tsql common-table-expression temp-tables table-variable

当我运行以下脚本时,Original_Table语句

会更新UPDATE
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表,但不更新Original_Table

为什么?

2 个答案:

答案 0 :(得分:2)

第一个示例通过CTE更新基于temp的查询的Original_Table。更新CTE时更新基表。正如here所述,CTE UPDATE语句的范围内

第二个示例查询Original_Table并将结果保存在新表中:#temp。然后更新临时表。没有魔术记忆#temp中的行绑定回Original_Table中的行,您可能不会想要一行。

答案 1 :(得分:1)

最后一句话

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)

只更新一些表名&#34; temp&#34;。声明中没有引用Original_Table

的内容