代码之家  ›  专栏  ›  技术社区  ›  Tadija Bagarić

T-SQL WITH…UPDATE示例解释

  •  0
  • Tadija Bagarić  · 技术社区  · 8 年前

    我只是找不到以下查询的某些部分是如何工作的文档或解释。

    查询:

    ;WITH ToUpdate AS (
        SELECT Id, 
               Foo, 
               FIRST_VALUE(Foo) OVER (ORDER BY Id) + 
                   ROW_NUMBER() OVER (ORDER BY Id) - 1 AS newFoo
        FROM mytable
        WHERE Bar= 1 
            AND Id >= 111
    )
    UPDATE ToUPDATE
    SET Foo = newFoo
    

    Giorgos Betsos 作为对另一个与下面描述的问题类似的问题的回答。

    假设我们有一张这样的桌子:

     Id   Foo  Bar
      2     5    1 
      3     6    1
     13   111   22
    111     7    1
    122    16    1
    154    17    1
    176    18    1
    

    • 将所有行与 Bar=1 Id >= 111
    • 按Id升序排列行
    • Foo 这样,新值等于上一行的值加1,从具有的行开始 Id = 111

    因此,生成的表如下所示:

     Id   Foo  Bar
      2     5    1 
      3     6    1
     13   111   22  <-- not affected 
    111     7    1
    122     8    1
    154     9    1
    176    10    1
    

    EXAMPLE

    但我不明白为什么WITH/UPDATE组合有效?

    为什么要更新基础表?乍一看,我认为只有WITH返回的视图/临时表会得到更新,而基础表则保持不变。

    1 回复  |  直到 8 年前
        1
  •  5
  •   Tim Biegeleisen    8 年前

    当您更新CTE中的列时,SQL Server会将该列追溯到其源表。在这种情况下 mytable 表中有一列名为 Foo 空白表 桌子

    UPDATE 语句,您可以运行 EXPLAIN 让自己相信这一点。

    如果你试图做一个 更新 涉及无法追溯到物理表的列的CTE。在这种情况下,您将得到如下错误: