【问题标题】:UPDATE with WITH-AS clause使用 WITH-AS 子句进行更新
【发布时间】:2017-04-21 10:17:50
【问题描述】:

当我运行以下脚本时,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)

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

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

这是为什么呢?

【问题讨论】:

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


【解决方案1】:

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

第二个示例查询Original_Table 并将结果保存在新表中#temp。然后更新临时表。没有神奇的记忆可以将#temp 中的行与Original_Table 中的行联系起来,您可能不会想要。

【讨论】:

    【解决方案2】:

    最后一句话

    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)
    

    只更新一些表名“temp”。声明中没有引用Original_Table

    【讨论】:

    • 是的,因为在语句中引用了 Original_Table。您的第一个脚本是一个单独的语句——一个执行更新的长且相当复杂的公用表表达式。第二个脚本是三个语句:一个 CREATE (temp) TABLE,后跟一个 INSERT,然后是一个 UPDATE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2014-03-16
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多