La clause WITH
Les expressions de table communes : nommer une requête, en enchaîner plusieurs, ce que WITH apporte face à une sous-requête imbriquée, et WITH RECURSIVE pour parcourir une hiérarchie.
- 20 cartes
- 6 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Les chiffres
- Mises en situation
- Comprendre
Quelques cartes du deck
Expression de table commune (CTE) : de quoi s'agit-il ?
Voir la réponse
Requête nommée en tête d'une instruction par
WITH nom AS (…): le reste de l'instruction la cite comme une table, sans la recopier.Le nom n'existe que pendant cette instruction, rien n'est enregistré dans la base. On peut en enchaîner plusieurs, séparées par des virgules, chacune pouvant citer les précédentes.
La table employe(id, nom, id_chef) contient : 1 Roux (NULL), 2 Sam (1), 3 Tara (1), 4 Uma (2), 5 Vik (2), 6 Wen (3), 7 Xav (4). Quels noms rend cette requête ?
```sql
WITH RECURSIVE equipe AS (
SELECT id, nom FROM employe WHERE id = 2
UNION ALL
SELECT e.id, e.nom
FROM employe e JOIN equipe q ON e.id_chef = q.id
)
SELECT nom FROM equipe;`Sam,Uma,ViketXavSam,UmaetVikUma,ViketXavRoux,Sam,Uma,ViketXav
Voir la réponse
Sam,Uma,ViketXavL'amorce donne Sam ; le premier tour ajoute ses subordonnés directs, Uma et Vik ; le deuxième ajoute ceux d'Uma, Xav ; le troisième ne trouve personne et la récursion s'arrête. Roux, supérieure de Sam, n'est jamais atteinte.
Le nom donné par
WITH nom AS (…)n'existe que pour … : il n'est pas enregistré dans la base.Voir la réponse
Le nom donné par
WITH nom AS (…)n'existe que pour cette seule instruction : il n'est pas enregistré dans la base.Dans l'instruction suivante, il faut le redéfinir :
SELECT * FROM total_clientrépondrelation "total_client" does not exist. Pour un nom durable, on crée une vue.Amorce : de quoi s'agit-il ?
Voir la réponse
Première partie d'une requête récursive, exécutée une seule fois : elle fournit les lignes de départ que la partie récursive va étendre.
Dans un organigramme, c'est par exemple
SELECT … FROM employe WHERE id_chef IS NULL, la directrice. Sans amorce, la récursion n'aurait rien à étendre.