De ce post Comment utiliser ROW_NUMBER dans la procédure suivante?
Il existe deux versions de réponses où l'une utilise a sub-query
et l'autre utilise a CTE
pour résoudre le même problème.
Maintenant, quel est l'avantage d'utiliser une CTE (Common Table Expression)
sur une `` sous-requête '' (donc, plus lisible ce que la requête fait réellement)
Le seul avantage d'utiliser un CTE
over sub-select
est que je peux nommer le fichiersub-query
. Existe-t-il d'autres différences entre les deux lorsqu'un CTE est utilisé comme un CTE simple (non récursif)?
sql
sql-server
tsql
subquery
common-table-expression
dance2die
la source
la source
Réponses:
Dans la sous-requête vs les versions CTE simples (non récursives), elles sont probablement très similaires. Vous devrez utiliser le profileur et le plan d'exécution réel pour repérer les différences, ce qui serait spécifique à votre configuration (nous ne pouvons donc pas vous donner la réponse dans son intégralité).
En général ; Un CTE peut être utilisé de manière récursive; une sous-requête ne peut pas. Cela les rend particulièrement bien adaptés aux structures arborescentes.
la source
A CTE can be used recursively; a sub-query cannot
. Un exemple aurait été formidable.Le principal avantage de l' expression de table commune (lorsque vous ne l'utilisez pas pour les requêtes récursives ) est l'encapsulation, au lieu d'avoir à déclarer la sous-requête à chaque endroit où vous souhaitez l'utiliser, vous pouvez la définir une fois, mais avoir plusieurs références à lui.
Cependant, cela ne signifie pas qu'il est exécuté une seule fois (comme par les itérations précédentes de cette même réponse , merci à tous ceux qui ont commenté). La requête a certainement le potentiel d'être exécutée plusieurs fois si elle est référencée plusieurs fois; l'optimiseur de requêtes prend finalement la décision quant à la façon dont le CTE doit être interprété.
la source
CTE
sont les plus utiles pour la récursivité:renverra des
@n
lignes (jusqu'à101
). Utile pour les calendriers, les ensembles de lignes factices, etc.Ils sont également plus lisibles (à mon avis).
En dehors de cela,
CTE
les etsubqueries
sont identiques.la source
;WITH blabla AS ...)
WITH
,MERGE
et mêmeUne différence qui n'a pas été mentionnée est qu'un seul CTE peut être référencé dans les différentes parties d'un syndicat
la source
À moins que je ne manque quelque chose, vous pouvez nommer les CTE et les sous-requêtes tout aussi facilement.
Je suppose que la principale différence est la lisibilité (je trouve le CTE plus lisible car il définit votre sous-requête à l'avant plutôt qu'au milieu).
Et si vous avez besoin de faire quoi que ce soit avec la récursivité, vous allez avoir un peu de mal à le faire avec une sous-requête;)
la source
Un fait important que personne n'a mentionné est que (au moins dans postgres), les CTE sont des clôtures d'optimisation:
https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/
Autrement dit, ils seront traités comme leur propre requête atomique, plutôt que repliés dans l'ensemble du plan de requête. Je n'ai pas l'expertise pour donner une meilleure explication, mais vous devriez vérifier la sémantique de la version de SQL que vous utilisez; pour les utilisateurs avancés, la possibilité de créer une clôture d'optimisation peut améliorer les performances si vous êtes expert dans le contrôle du planificateur de requêtes; dans 99% des cas, cependant, vous devriez éviter d'essayer de dire au planificateur de requêtes ce qu'il doit faire, car ce que vous pensez être plus rapide est probablement pire que ce qu'il pense sera plus rapide. :-)
la source
En ajoutant aux réponses des autres, si vous avez une seule et même sous-requête utilisée plusieurs fois, vous pouvez remplacer toutes ces sous-requêtes par un CTE. Cela vous permet de mieux réutiliser votre code.
la source
Une chose que vous devez également comprendre est que dans les anciennes versions de SQL Server (oui, de nombreuses personnes doivent encore prendre en charge les bases de données SQL Server 2000), les CTE ne sont pas autorisés et la table dérivée est votre meilleure solution.
la source
CONSEIL: (MAXRECURSION n)
Par exemple, vous pouvez essayer:
la source