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

Jak pisać zaangażowane podzapytanie rekurencyjne w sqlplus z wieloma tabelami do śledzenia węzłów?

W twoim uproszczonym przykładzie (tak jakby zacząłem używać twoich prawdziwych nazw tabel, ale są to oryginalne dane) możesz uzyskać wszystkie trasy przez wiele przełączników za pomocą:

with rcte (rootsectionnumber, fromsectionnumber, tosectionnumber) as (
  select fromsectionnumber, fromsectionnumber, tosectionnumber
  from switchingdevice
  where normalswitchingdevicestate = 'CLOSED'
  union all
  select r.rootsectionnumber, sd.fromsectionnumber, sd.tosectionnumber
  from rcte r
  join switchingdevice sd on sd.fromsectionnumber = r.tosectionnumber
)
select rootsectionnumber, tosectionnumber from rcte;

ROOTSECTIONNUMBER TOSECTIONNUMBER
----------------- ---------------
               54             105
              105             106
              105             999
              999             700
               54             106
              105             500
               54             999
              105             700
               54             500
               54             700
 

z których jeden ma trasę od końca do końca od sekcji 54 do 700; a następnie możesz dołączyć to do definicji obciążenia:

with rcte (rootsectionnumber, fromsectionnumber, tosectionnumber) as (
  select fromsectionnumber, fromsectionnumber, tosectionnumber
  from switchingdevice
  where normalswitchingdevicestate = 'CLOSED'
  union all
  select r.rootsectionnumber, sd.fromsectionnumber, sd.tosectionnumber
  from rcte r
  join switchingdevice sd on sd.fromsectionnumber = r.tosectionnumber
)
select ld.loadnumber, t.transformernumber
from loaddefinition ld
join rcte r on r.rootsectionnumber = ld.sectionnumber
join transformer t on t.tosectionnumber = r.tosectionnumber
where ld.loadnumber = 100;

LOADNUMBER TRANSFORMERNUMBER
---------- -----------------
       100              5000
 

Lub jeśli musisz podać busnumber w logice (na podstawie krótkiego spojrzenia na większe zapytanie...):

with rcte (rootsectionnumber, busnumber, fromsectionnumber, tosectionnumber) as ( select fromsectionnumber, busnumber, fromsectionnumber, tosectionnumber from switchingdevice where normalswitchingdevicestate = 'CLOSED' union all select r.rootsectionnumber, r.busnumber, sd.fromsectionnumber, sd.tosectionnumber from rcte r join switchingdevice sd on sd.fromsectionnumber = r.tosectionnumber and sd.busnumber = r.busnumber ) select ld.loadnumber, t.transformernumber from loaddefinition ld join rcte r on r.rootsectionnumber = ld.sectionnumber and r.busnumber = ld.busnumber join transformer t on t.tosectionnumber = r.tosectionnumber and t.tobusnumber = r.busnumber where ld.loadnumber = 100; LOADNUMBER TRANSFORMERNUMBER ---------- ----------------- 100 5000

db<>skrzypce

Dodanie innych tabel oczywiście trochę skomplikuje sprawę, ale nie jest do końca jasne, w jaki sposób wszystkie są ze sobą powiązane.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Logrotate, aby wyczyścić pliki opatrzone datą

  2. Strona główna Oracle 10g express nie pojawia się

  3. Zapytanie o relacje klucza obcego tabeli

  4. Oracle PL/SQL:Przykład DBMS_SCHEDULER.CREATE_JOB

  5. Wyświetl listę wszystkich wyzwalaczy w bazie danych Oracle