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;
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