Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Hierarquia completa do Oracle SQL dado qualquer nó como entrada


Se você quiser usá-lo como visualização, você pode fazer algo como o seguinte:
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

A subconsulta rek conecta todos os irmãos da árvore com o elemento raiz. Então você só precisa usar essa consulta duas vezes e conectá-la através do elemento raiz para obter todos os elementos que estão conectados por meio da relação pai-filho.

Se você quiser reduzir o conjunto de resultados, você pode usar o SYS_CONNECT_BY_PATH para fazê-lo:
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)

Isso, por exemplo, fornecerá apenas os filhos e os pais do seu ponto de partida e nenhuma entrada de outras folhas.