Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pełna hierarchia Oracle SQL z dowolnym węzłem jako danymi wejściowymi

Jeśli chcesz użyć go jako widoku, możesz zrobić coś w następujący sposób:

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

Podzapytanie rek łączy wszystkie rodzeństwo drzewa z elementem głównym. Następnie wystarczy użyć tego zapytania dwa razy i połączyć je przez element główny, aby uzyskać wszystkie elementy, które są połączone relacją rodzic-dziecko.

Jeśli chcesz zmniejszyć zestaw wyników, możesz użyć SYS_CONNECT_BY_PATH aby to zrobić:

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 na przykład da ci tylko twoje dzieci i rodziców z twojego punktu startowego i żadnych wpisów z innych liści.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak używać wpisów tns ze sterownikami macromedia dla Oracle

  2. Oracle INSERT INTO SELECT(...) Zachowanie wyjątku DUP_VAL_ON_INDEX

  3. PostgreSQL odpowiednik funkcji PERCENTILE_CONT Oracle

  4. Konwertuj wartości oddzielone przecinkami na wiersze w Oracle

  5. jak wyłączyć jednoczesne połączenia jednego użytkownika w Oracle