Oracle
 sql >> Base de données >  >> RDS >> Oracle

Hiérarchie complète d'Oracle SQL avec n'importe quel nœud en entrée

Si vous souhaitez l'utiliser comme vue, vous pouvez procéder comme suit :

WITH rek AS (SELECT item.id
                  , item.name
                  , connect_by_root item.id root_id
               FROM item
              START WITH parent_id IS null
            CONNECT BY NOCYCLE parent_id = PRIOR id)
SELECT startItem.id startId
     , startItem.name startName
     , childItem.id childID
     , childItem.name childName
  FROM rek startItem
  JOIN rek childItem
  USING (root_id)
-- WHERE startItem.id = 3 -- This would be done from outside the view

La sous-requête rek connecte tous les frères de l'arbre avec l'élément racine. Ensuite, il vous suffit d'utiliser cette requête deux fois et de la connecter via l'élément racine pour obtenir tous les éléments connectés via une relation parent-enfant.

Si vous souhaitez réduire le jeu de résultats, vous pouvez utiliser le SYS_CONNECT_BY_PATH pour ce faire :

WITH rek AS (SELECT item.id
                  , item.name
                  , connect_by_root item.id root_id
                  , SYS_CONNECT_BY_PATH(item.id, '/') path
               FROM item
              START WITH parent_id IS null
            CONNECT BY NOCYCLE parent_id = PRIOR id)
SELECT startItem.id startId
     , startItem.name startName
     , childItem.id childID
     , childItem.name childName
     , childItem.path 
  FROM rek startItem
  JOIN rek childItem
    ON startItem.root_id = childItem.root_id
    AND (startItem.path LIKE childItem.path||'/%'
      OR childItem.path LIKE startItem.path||'/%'
      OR childItem.id = startItem.id)

Ceci, par exemple, ne vous donnera que les enfants et les parents de votre point de départ et aucune entrée d'autres feuilles.