Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara menulis subquery rekursif yang terlibat dalam sqlplus dengan beberapa tabel untuk melacak node?

Dalam contoh sederhana Anda (semacam, saya mulai menggunakan nama tabel asli Anda, tetapi itu adalah data asli), Anda bisa mendapatkan semua rute melalui beberapa sakelar dengan:

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

salah satunya memiliki rute ujung ke ujung dari seksi 54 hingga 700; dan Anda kemudian dapat menggabungkannya dengan definisi beban:

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

Atau jika Anda perlu menyertakan busnumber dalam logika (berdasarkan pandangan singkat pada kueri Anda yang lebih besar...):

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<>biola

Menambahkan di tabel Anda yang lain jelas akan sedikit memperumit masalah, tetapi tidak begitu jelas bagaimana semuanya terkait.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menampilkan output sys_refcursor pl sql dengan alat Toad

  2. Oracle - Bagaimana cara mendapatkan ukuran sebenarnya dari ROW tertentu?

  3. Permintaan sql Oracle perlu diubah berdasarkan zona waktu

  4. Menggunakan sqlalchemy dburi dengan Oracle menggunakan External Password Store?

  5. Masalah penyatuan koneksi pegas