Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để viết truy vấn con đệ quy liên quan trong sqlplus w / nhiều bảng để theo dõi các nút?

Trong ví dụ đơn giản của bạn (đại loại là tôi đã bắt đầu sử dụng tên bảng thực của bạn, nhưng đó là dữ liệu gốc), bạn có thể lấy tất cả các tuyến thông qua nhiều công tắc với:

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

một trong số đó có tuyến cuối đoạn 54 - 700; và sau đó bạn có thể kết hợp nó với định nghĩa tải:

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

Hoặc nếu bạn cần bao gồm busnumber theo logic (dựa trên cái nhìn ngắn gọn về truy vấn lớn hơn của bạn ...):

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

Việc thêm vào các bảng khác của bạn rõ ràng sẽ làm mọi thứ phức tạp hơn một chút, nhưng không rõ ràng chúng liên quan như thế nào.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thủ tục PL / SQL:CẬP NHẬT tên chữ hoa thành initcaps, với cách xử lý đặc biệt đối với một số giá trị

  2. Cách chèn nhiều hàng trong cùng một bảng-Oracle 10g

  3. Làm cách nào để mã hóa các ký tự từ Oracle sang XML?

  4. Tăng VOTE diskgroup trong ASM để nâng cấp GI 12.2

  5. Oracle tham gia - So sánh giữa cú pháp thông thường và cú pháp ANSI