Vous allez peut-être me dire «CTE ? Quésako ?». Les requêtes CTE ou Common Table Expressions peuvent être considérées comme des tables ou vues temporaires qui vont exister seulement dans le cadre de l’exécution d’une requête. Pour notre plus grand bonheur, cela ne se limite pas à une simple vue ou table temporaire, nous pouvons y ajouter de la récursivité.

Les requêtes CTE vont avoir plusieurs utilités notamment pour :

  • rendre plus claires des requêtes complexes construites à partir de résultats d’autres requêtes.
  • ne plus passer par des fonctions en pl/pgsql pour faire de la récursivité

L’instruction permettant cela est WITH [RECURSIVE] qui est disponible depuis postgresql 8.4 pour les requêtes CTE de type SELECT et depuis la 9.1 pour les types INSERT, UPDATE et DELETE.

NB : les requêtes qui seront comprises dans le WITH ne seront évaluées qu’une fois, ce qui permet d’avoir de bonnes performances et le même ensemble de données.

# Syntaxe d’une requête CTE

La clause WITH permet de spécifier une ou plusieurs sous requêtes qui pourront être référencées par leur nom dans la requête principale. En option, une liste de noms de colonnes peut être spécifié, si ce n’est pas spécifié, les noms de colonnes sont déduites de la sous-requête.

# Requête CTE sans récursivité

Nous allons commencer en douceur avec un modèle assez basique :

Sans passer par une requête CTE voilà grosso modo ce qu’il faudrait faire si l’on veut obtenir la catégorie contenant le plus d’articles :

En somme cela n’est pas très simple ni très lisible. Avec une requête CTE voilà ce que cela donne :

Les requêtes CTE trouvent aussi leur utilité dans postgres 9.2 avec le format JSON cela évite de devoir créer un type, vue, table ou sous-requête pour avoir les noms des champs « mappés » dans le flux JSON. Admettons que l’on veuille la liste des catégories avec leur nombre d’articles :

on obtient alors un JSON de nos catégories :

# Requête CTE avec récursivité

Fini de rigoler, passons à la récursivité 😉

Le but du jeu : récupérer l’arbre des catégories avec leur niveau de hiérarchie

résultats :

idcategorie libelle filariane idcategorieparente rang
1 Bases de données Bases de données 1
2 PostgreSQL Bases de données > PostgreSQL 1 2
3 Installation Bases de données > PostgreSQL > Installation 2 3
4 Administration Bases de données > PostgreSQL > Administration 2 3
5 Outils Bases de données > PostgreSQL > Outils 2 3
6 Requêtes Bases de données > PostgreSQL > Requêtes 2 3
7 Langage SQL Bases de données > PostgreSQL > Requêtes > Langage SQL 6 4
8 Conception Bases de données > PostgreSQL > Outils > Conception 5 4


Après ces quelques exemples, on peut donc se rendre compte de la puissance et de la facilité qu’apporte les requêtes CTE dans PostgreSQL autant en terme de lisibilité/simplification sur des requêtes complexes que sur l’ajout de la récursivité.