sql >> Database teknologi >  >> RDS >> Oracle

Oracle SQL fuld hierarki givet enhver node som input

Hvis du vil bruge det som visning, kan du gøre noget som følgende:

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

Underforespørgslen rek forbinder alle søskende af træet med rodelementet. Så skal du kun bruge denne forespørgsel to gange og forbinde den via rodelementet for at få alle elementer, der er forbundet via forældre-barn-relation.

Hvis du vil reducere resultaterne, kan du bruge SYS_CONNECT_BY_PATH for at gøre det:

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)

Dette vil f.eks. give dig kun dine børns og forældres udgangspunkt og ingen indgange fra andre blade.



  1. Vælg boks:hvordan udfyldes år php

  2. Oracle trækker dage og minutter fra

  3. SET en variabel i SELECT-sætning - MySQL

  4. Sådan kontrolleres om værdi findes i en MySQL-database