sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL full hierarki ges vilken nod som helst som indata

Om du vill använda den som vy kan du göra något som följande:

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

Underfrågan rek kopplar alla syskon till trädet med rotelementet. Sedan behöver du bara använda den här frågan två gånger och koppla den via rotelementet för att få alla element som är kopplade via förälder-barn-relation.

Om du vill minska resultaten kan du använda SYS_CONNECT_BY_PATH för att göra 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)

Detta ger dig till exempel endast dina barns och föräldrars startpunkt och inga inlägg från andra blad.



  1. Rails ActiveRecord - finns det ett sätt att utföra operationer på tabeller utan ett id?

  2. Problem med Oracle-bindningsvariabler som inte använder index korrekt

  3. Infoga MyISAM-nyckeln i en INNODB-tabell

  4. PG::Fel:FEL:ogiltig bytesekvens för kodning av UTF8:0xfc