En réponse aux commentaires sur la réponse de rexem, en ce qui concerne la question de savoir si une vue en ligne ou un CTE serait plus rapide, j'ai remanié les requêtes pour utiliser une table que j'avais, et que tout le monde avait, à disposition : sys.objects.
WITH object_rows AS (
SELECT object_id,
ROW_NUMBER() OVER ( ORDER BY object_id) RN
FROM sys.objects)
SELECT object_id
FROM object_rows
WHERE RN > 1
SELECT object_id
FROM (SELECT object_id,
ROW_NUMBER() OVER ( ORDER BY object_id) RN
FROM sys.objects) T
WHERE RN > 1
Les plans de requêtes produits étaient exactement les mêmes. Je m'attendrais à ce que, dans tous les cas, l'optimiseur de requêtes produise le même plan, au moins en remplaçant simplement le CTE par une vue en ligne ou vice versa.
Bien entendu, essayez vos propres requêtes sur votre propre système pour voir s'il y a une différence.
Aussi, row_number()
dans la clause where est une erreur courante dans les réponses données sur Stack Overflow. En toute logique row_number()
n'est pas disponible tant que la clause de sélection n'est pas traitée. Les gens oublient cela et lorsqu'ils répondent sans tester la réponse, celle-ci est parfois fausse. (Une accusation dont je me suis moi-même rendu coupable).