sql >> Base de Datos >  >> RDS >> Oracle

Jerarquía completa de Oracle SQL dado cualquier nodo como entrada

Si desea usarlo como vista, puede hacer algo como lo siguiente:

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 subconsulta rek conecta a todos los hermanos del árbol con el elemento raíz. Luego, solo tiene que usar esta consulta dos veces y conectarla a través del elemento raíz para obtener todos los elementos que están conectados a través de la relación padre-hijo.

Si desea reducir el conjunto de resultados, puede usar SYS_CONNECT_BY_PATH para hacerlo:

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)

Esto, por ejemplo, le dará solo los hijos y los padres de su punto de partida y ninguna entrada de otras hojas.