You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在无FROM子句的UPDATE中直接引用CTE是否属于未记录行为?

UPDATE直接引用CTE的语法疑问

官方文档对UPDATE语句前半部分的语法定义如下:

UPDATE   
    [ TOP ( expression ) [ PERCENT ] ]   
    { { table_alias | <object> | rowset_function_limited   
         [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
      }  
      | @table_variable      
    }  

其中<object>的定义为:

<object> ::=  
{   
    [ server_name . database_name . schema_name .   
    | database_name .[ schema_name ] .   
    | schema_name .  
    ]  
    table_or_view_name}  

文档同时说明,table_or_view_name是要更新行的表或视图名称,且视图必须可更新且仅引用一个基表。

据我了解,上述定义里完全没提到CTE,但直接在UPDATE后引用CTE的写法是有效的,比如:

;WITH T AS
(   SELECT  InvoiceNumber, 
            DocTotal, 
            SUM(Sale + VAT) OVER(PARTITION BY InvoiceNumber) AS NewDocTotal
    FROM    PEDI_InvoiceDetail
)
UPDATE  T
SET     DocTotal = NewDocTotal

注意这里UPDATE和CTE引用之间没有任何内容,甚至连FROM子句都没有。

我想知道是我漏看了文档里的相关说明,还是这种用法属于未记录的行为?需要明确:我讨论的不是在UPDATE的FROM子句中使用CTE,而是直接用UPDATE FOO的形式引用名为FOO的CTE——目前文档里的CTE示例都用到了FROM子句。

内容的提问来源于stack exchange,提问作者J. Mini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:45:58