0

当我运行下面的脚本,Original_Table得到由UPDATE声明UPDATE与-AS子句

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) 

更新,但是当我替换为以下

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

为什么?

+0

这被称为公用表表达式。对于MS Sql,请参阅https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx – Serg

+2

我没有看到任何尝试更新'original_table'。 –

+0

'UPDATE'是一样的。只有'WITH'改变。 –

回答

2

第一个示例更新temp,它基于来自Original_Table的查询,通过CTE的方式。基础表在CTE更新时更新。如解释here,CTE是内的范围内的UPDATE声明。

第二个示例查询Original_Table并将结果保存在新表#temp中。临时表然后被更新。没有魔法内存,将#temp中的行关联回Original_Table中的行,并且您可能不需要其中的行。

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) 

只更新部分表名 “温度”。声明中没有任何内容引用Original_Table

+0

在第一种情况下,它更新'Original_Table' –

+0

是的,因为在语句中引用了Original_Table。您的第一个脚本是一个单独的语句 - 执行更新的一个长且相当复杂的公用表表达式。第二个脚本是三个语句:一个CREATE(temp)TABLE,后跟一个INSERT,后跟一个UPDATE。 –