web-dev-qa-db-ja.com

CTEを使用したUPDATEテーブル

テーブル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)。

誰かがこれを説明できますかmagic

次のステートメントもまったく同じように動作します。

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;
2
Matteo Gariglio

魔法はありません。この場合のCTEは更新可能なビューです。

更新可能および挿入可能なビュー:

次のステートメントはまったく同じように見えます:

一般的に-いいえ。 idが一意ではないことを想像してみてください。

最初のオプションの方が優れていますか?

異なる(一般的な)ロジックを持つ2つのクエリは比較できません。 - アキナ

0
user126897