Clause SQL WITH : expressions de table communes (CTE) et requêtes récursives
Published: 2026-02-04
La clause WITH (également appelée expression de table commune ou CTE) vous permet de définir des jeux de résultats temporaires nommés que vous pouvez référencer dans une requête. Cela rend les requêtes complexes plus lisibles et réutilisables. Elle est disponible dans la plupart des bases de données SQL modernes, notamment SQLite, PostgreSQL, MySQL 8.0+, SQL Server et Oracle.
Données d’exemple
Nous utilisons deux tables dans tous les exemples :
Table employees :
| id | name | manager_id | salary |
|---|---|---|---|
| 1 | Alice | NULL | 120000 |
| 2 | Bob | 1 | 80000 |
| 3 | Carol | 1 | 85000 |
| 4 | Dave | 2 | 60000 |
| 5 | Eve | 2 | 62000 |
| 6 | Frank | 3 | 58000 |
Table sales :
| id | employee_id | amount | month |
|---|---|---|---|
| 1 | 2 | 5000 | January |
| 2 | 2 | 6000 | February |
| 3 | 3 | 7000 | January |
| 4 | 3 | 8000 | February |
| 5 | 4 | 3000 | January |
| 6 | 5 | 4000 | January |
| 7 | 6 | 2500 | February |
Clause WITH de base (non récursive)
Une clause WITH définit une ou plusieurs tables temporaires nommées qui n’existent que pendant la durée de la requête.
Exemple : ventes totales par employé
La CTE employee_sales calcule le total des ventes par employé, puis nous la joignons à la table employees pour afficher les noms.
CTE multiples
Vous pouvez définir plusieurs CTE séparées par des virgules. Les CTE définies plus tard peuvent référencer celles définies plus tôt.
Exemple : analyse des ventes avec plusieurs indicateurs
WITH RECURSIVE : parcourir des hiérarchies
WITH RECURSIVE permet à une CTE de se référencer elle-même, ce qui vous permet de parcourir des données hiérarchiques ou en forme d’arbre. C’est utile pour les organigrammes, les hiérarchies de catégories ou toute relation parent-enfant.
Une CTE récursive comporte deux parties :
- Requête de base : l’ensemble initial de lignes
- Requête récursive : référence la CTE elle-même pour trouver les lignes liées
Exemple : organigramme (tous les employés sous un manager)
Trouver tous les employés sous Alice (la PDG) :
Exemple : chaîne hiérarchique (trouver la hiérarchie des managers)
Trouver la chaîne hiérarchique complète pour Dave (qui reporte à Bob, qui reporte à Alice) :
Syntaxe WITH RECURSIVE selon les bases de données
WITH RECURSIVE est pris en charge dans :
- SQLite — 3.8.3+ (2013)
- PostgreSQL — 8.4+ (2009)
- SQL Server — 2005+ (appelé « Recursive CTE »)
- Oracle — 11g+ (appelé « Recursive Subquery Factoring »)
- MySQL — 8.0+ (2018)
Remarque : les anciennes versions de MySQL et certaines autres bases de données ne prennent pas en charge les CTE récursives ; elles peuvent nécessiter d’autres approches comme des procédures stockées ou une récursivité au niveau de l’application.
Cas d’usage courants pour les clauses WITH
- Simplifier les requêtes complexes — Décomposer une grande requête en étapes logiques
- Réutiliser des sous-requêtes — Définir un calcul une fois et l’utiliser plusieurs fois
- Parcours hiérarchique — Naviguer dans des arbres (organigrammes, catégories, commentaires)
- Génération de séquences — Créer des plages de nombres ou de dates
- Agrégations progressives — Construire les résultats par étapes
Résumé
WITH(CTE) crée un jeu de résultats temporaire nommé à utiliser dans une requête- Plusieurs CTE peuvent être chaînées
WITH RECURSIVEpermet à une CTE de se référencer elle-même pour des requêtes hiérarchiques- Les CTE récursives nécessitent un cas de base et un cas récursif séparés par
UNION ALL - Pris en charge dans toutes les bases de données SQL modernes (bien que la syntaxe puisse légèrement varier)
Essayez de modifier les exemples ci-dessus pour explorer différentes hiérarchies ou calculs !