Aller au contenu | Aller au menu | Aller à la recherche

La clause optionnelle CYCLE dans un SELECT récursif

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.

La discussion continue ailleurs

URL de rétrolien : https://www.footcow.com/index.php?trackback/119

Fil des commentaires de ce billet