J'ai commencé à lire sur Common Table Expression et je ne peux pas penser à un cas d'utilisation où j'aurais besoin de les utiliser. Ils sembleraient redondants car on peut faire de même avec les tables dérivées. Y a-t-il quelque chose qui me manque ou que je ne comprends pas bien? Quelqu'un peut-il me donner un exemple simple de limitations avec des requêtes régulières de table de sélection, dérivée ou temporaire pour faire le cas de CTE? Tout exemple simple serait très apprécié.
select top 100 * into #tmp from master..spt_values order by 1,2,3,4 select A.number, COUNT(*) from #tmp A inner join #tmp B ON A.number = B.number+1 group by A.number
vswith CTE AS (select top 100 * from master..spt_values order by 1,2,3,4) select A.number, COUNT(*) from CTE A inner join CTE B ON A.number = B.number+1 group by A.number
Je les utilise pour décomposer des requêtes complexes, en particulier des jointures et des sous-requêtes complexes. Je trouve que je les utilise de plus en plus comme des «pseudo-vues» pour m'aider à comprendre l'objectif de la requête.
Ma seule plainte à leur sujet est qu'ils ne peuvent pas être réutilisés. Par exemple, je peux avoir un proc stocké avec deux instructions de mise à jour qui pourraient utiliser le même CTE. Mais la «portée» du CTE n'est que la première requête.
Le problème est que les «exemples simples» n'ont probablement pas vraiment besoin de CTE!
Pourtant, très pratique.
la source
VIEW
:)Je vois deux raisons d'utiliser les cte.
Pour utiliser une valeur calculée dans la clause where. Cela me semble un peu plus propre qu'une table dérivée.
Supposons qu'il existe deux tableaux - Questions et réponses jointes par Questions.ID = Answers.Question_Id (et quiz id)
Voici un autre exemple où je veux obtenir une liste de questions et réponses. Je veux que les réponses soient regroupées avec les questions dans les résultats.
la source
HAVING
est une autre façon de faire un filtre à un stade avancé qui peut être similaire à l'utilisation d'un sous-SELECT
L'un des scénarios que j'ai trouvé utile d'utiliser CTE est lorsque vous souhaitez obtenir des lignes de données DISTINCT basées sur une ou plusieurs colonnes mais renvoyer toutes les colonnes de la table. Avec une requête standard, vous devrez peut-être d'abord vider les valeurs distinctes dans une table temporaire, puis essayer de les joindre à la table d'origine pour récupérer le reste des colonnes ou vous pouvez écrire une requête de partition extrêmement complexe qui peut renvoyer les résultats dans une exécution mais, selon toute probabilité, elle sera illisible et entraînera un problème de performances.
Mais en utilisant CTE (comme l'a répondu Tim Schmelter sur Sélectionner la première instance d'un enregistrement )
Comme vous pouvez le voir, c'est beaucoup plus facile à lire et à entretenir. Et par rapport à d'autres requêtes, les performances sont bien meilleures.
la source
Il est peut-être plus judicieux de penser à un CTE comme substitut à une vue utilisée pour une seule requête. Mais ne nécessite pas la surcharge, les métadonnées ou la persistance d'une vue formelle. Très utile lorsque vous devez:
Voici un exemple de copier-coller pour jouer avec:
Prendre plaisir
la source
Aujourd'hui, nous allons en apprendre davantage sur l'expression de table commune qui est une nouvelle fonctionnalité introduite dans SQL Server 2005 et également disponible dans les versions ultérieures.
Expression de table commune: - L'expression de table commune peut être définie comme un jeu de résultats temporaire ou en d'autres termes, c'est un substitut des vues dans SQL Server. L'expression de table commune n'est valide que dans le lot d'instructions où elle a été définie et ne peut pas être utilisée dans d'autres sessions.
Syntaxe de déclaration de CTE (expression de table commune): -
Prenons un exemple: -
J'ai créé deux tables employé et département et inséré 5 lignes dans chaque table. Maintenant, je voudrais rejoindre ces tables et créer un jeu de résultats temporaire pour l'utiliser davantage.
Permet de prendre chaque ligne de l'énoncé un par un et de comprendre.
Pour définir CTE, nous écrivons la clause "with", puis nous donnons un nom à l'expression de table, ici j'ai donné le nom "CTE_Example"
Ensuite, nous écrivons "As" et mettons notre code entre deux crochets (---), nous pouvons joindre plusieurs tables entre crochets.
Dans la dernière ligne, j'ai utilisé "Select * from CTE_Example", nous faisons référence à l'expression de la table Common dans la dernière ligne de code, nous pouvons donc dire que c'est comme une vue, où nous définissons et utilisons la vue en une seule batch et CTE n'est pas stocké dans la base de données en tant qu'objet permanent. Mais il se comporte comme une vue. nous pouvons effectuer une instruction de suppression et de mise à jour sur CTE et cela aura un impact direct sur la table référencée qui est utilisée dans CTE. Prenons un exemple pour comprendre ce fait.
Dans l'instruction ci-dessus, nous supprimons une ligne de CTE_Example et cela supprimera les données de la table référencée "DEPT" qui est utilisée dans le CTE.
la source
Il est très utile lorsque vous souhaitez effectuer une "mise à jour commandée".
MS SQL ne vous permet pas d'utiliser ORDER BY avec UPDATE, mais avec l'aide de CTE, vous pouvez le faire de cette façon:
Regardez ici pour plus d'informations: Comment mettre à jour et commander en utilisant ms sql
la source
Un point pas encore souligné, c'est la vitesse . Je sais que c'est une vieille question à réponse, mais je pense que cela mérite un commentaire / réponse directe:
Lorsque j'ai utilisé CTE la toute première fois, j'ai été absolument stupéfait par sa vitesse. C'était un cas comme dans un manuel, très adapté au CTE, mais dans toutes les situations où j'ai jamais utilisé le CTE, il y avait un gain de vitesse significatif. Ma première requête était complexe avec des tables dérivées, prenant de longues minutes à exécuter. Avec CTE, cela a pris des fractions de secondes et m'a choqué, c'est même possible.
la source
essaye ça
la source