T-Sql

使用 CTE 更新表

  • June 11, 2019

我想更新我的表的排名,Performance我找到了這個解決方案,但我不明白為什麼這個 SQL 程式碼有效:

WITH cte AS (
   SELECT AllTimeRank, r = RANK () OVER (PARTITION BY Distance ORDER BY TimeInSeconds) 
   FROM dbo.Performance
)
UPDATE cte 
SET AllTimeRank = r FROM cte;

聲明說UPDATE CTE,但實際上,它確實更新了表 ( dbo.Performance)。

有人可以解釋一下這個魔法嗎?

以下語句似乎完全相同:

WITH cte AS (
    SELECT Id, r = RANK () OVER (PARTITION BY Distance ORDER BY TimeInSeconds)
    FROM dbo.Performance
)
UPDATE dbo.Performance 
SET AllTimeRank = r 
FROM cte INNER JOIN dbo.Performance p ON p.Id = cte.Id;

沒有魔法。在這種情況下,CTE 是一個可更新的視圖。

可更新和可插入的視圖:

以下語句似乎完全相同:

一般來說 - 沒有。簡單地想像這id不是唯一的。

第一個選項更好嗎?

無法比較具有不同(一般)邏輯的兩個查詢。-秋名

引用自:https://dba.stackexchange.com/questions/240261