La clause optionnelle CYCLE dans un SELECT récursif
Par admin le jeudi 11 novembre 2021, 20:54 - PostgreSQL - Lien permanent
Tout d'abord, voyons ce qu'est un SELECT
récursif. Il s'agit d'une requête qui se réfère à elle-même dans la clause FROM
pour produire une série de résultats itératifs. Cette fonctionnalité est souvent utilisée pour parcourir des structures de données hiérarchiques telles que les arbres.
Maintenant, parlons de la clause CYCLE
disponible depuis PostgreSQL 14. Elle est optionnelle et peut être utilisée dans les SELECT
récursifs pour détecter les cycles dans la hiérarchie des données. En d'autres termes, si une boucle se produit dans la hiérarchie, la clause CYCLE
permet de signaler l'erreur et d'empêcher la requête de boucler indéfiniment.
Supposons que nous avons une table "employees
" avec une colonne "manager_id
" qui fait référence à l'ID du manager de chaque employé. Nous voulons récupérer tous les managers et leurs subordonnés, en utilisant un SELECT
récursif.
Voici la requête que nous pourrions utiliser :
WITH RECURSIVE manager_tree AS ( SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id FROM employees e JOIN manager_tree m ON e.manager_id = m.id CYCLE id ) SELECT * FROM manager_tree;
Dans cette requête, la clause CYCLE
est utilisée pour empêcher une boucle infinie. Si nous n'utilisions pas la clause CYCLE
, la requête bouclerait indéfiniment car elle essaierait de récupérer les employés dont les managers sont leurs propres subordonnés.
En ajoutant la clause CYCLE
, nous spécifions que la colonne "id
" doit être vérifiée pour détecter les cycles dans la hiérarchie des managers. Si un cycle est détecté, la requête s'arrête à ce niveau-là.
En utilisant cette requête, nous obtenons une liste de tous les managers et de leurs subordonnés, avec une colonne supplémentaire "id
" qui indique si un cycle a été détecté dans la hiérarchie des managers.
J'espère que cette explication a été utile pour comprendre le fonctionnement de la clause CYCLE
dans un SELECT
récursif de PostgreSQL.