sql >> Databáze >  >> RDS >> Oracle

Úplná hierarchie Oracle SQL s libovolným uzlem jako vstupem

Pokud jej chcete použít jako zobrazení, můžete provést následující:

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

Poddotaz rek spojuje všechny sourozence stromu s kořenovým prvkem. Pak stačí tento dotaz použít dvakrát a připojit jej přes kořenový prvek, abyste získali všechny prvky, které jsou propojeny prostřednictvím vztahu rodič-dítě.

Pokud chcete zmenšit sadu výsledků, můžete použít SYS_CONNECT_BY_PATH jak to udělat:

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)

To vám například poskytne výchozí bod pouze vašim dětem a rodičům a žádné záznamy z jiných listů.



  1. Ignorujte konkrétní kritéria WHERE

  2. PostgreSQL:výchozí názvy omezení

  3. Jak převedu databázi Oracle na MySQL?

  4. Co je OracleType ROWNUM