Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Résultats inattendus du CTE

Il n'y a rien d'inattendu dans ce résultat, sauf peut-être si vous ne le comprenez pas.

Chaque CTE est résolu each and every time il est référencé. Oui, c'est pourquoi il est possible pour un simple CTE sur une table hautement transactionnelle de renvoyer 4 lignes dans une référence et 5 lignes dans les 2 niveaux suivants.

Sur votre échantillon cependant, c'est à cause de ORDER BY NEWID(), donnant à chaque résolution du CTE d'origine un row_number() différent. Pensiez-vous que les CTE sont stockés en mémoire et mis en cache ? Sur le site SQLFiddle, sous vos résultats, il y a un lien "voir le plan d'exécution". Il affiche 2 analyses distinctes et séparées du tableau .