Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle SQL пълна йерархия, дадена на всеки възел като вход

Ако искате да го използвате като изглед, можете да направите нещо като следното:

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

Подзаявката rek свързва всички братя на дървото с коренния елемент. След това трябва само да използвате тази заявка два пъти и да я свържете чрез основния елемент, за да получите всички елементи, които са свързани чрез релация родител-дете.

Ако искате да намалите набора от резултати, можете да използвате SYS_CONNECT_BY_PATH за да направите това:

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)

Това например ще ви даде само децата и родителите на вашата начална точка и никакви записи от други листове.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Материализиран изглед спрямо таблици:Какви са предимствата?

  2. Използване на Oracle:Мога ли да използвам „динамично“ създадена променлива в клаузата за завъртане?

  3. Как да се свържа с база данни на Oracle с помощта на cx_Oracle с име на услуга и вход?

  4. Заявка за актуализиране на Oracle с помощта на Join

  5. Създайте ограничение в таблицата за промяна, без да проверявате съществуващите данни