web-dev-qa-db-fra.com

Tableau de mise à jour à l'aide de CTE

Je voulais mettre à jour les rangs de ma table Performance et j'ai trouvé cette solution, mais je ne comprends pas pourquoi ce code SQL fonctionne:

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

La déclaration dit UPDATE CTE Mais en fait, il met vraiment à jour la table (dbo.Performance).

quelqu'un peut-il m'expliquer ceci Magic ?

La déclaration suivante semble faire exactement la même chose:

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

Pas de magie. CTE Dans ce cas est une vue mise à jour.

Vues mises à jour et insérables:

La déclaration suivante semble faire exactement la même chose:

En général - non. Imaginez simplement que id n'est pas unique.

est la première option meilleure?

Deux requêtes avec une logique différente (générale) ne peuvent pas être comparées. - Akina

0
user126897