sql >> Database teknologi >  >> RDS >> Oracle

Hvordan skriver man involveret rekursiv underforespørgsel i sqlplus med flere tabeller for at spore noder?

I dit forenklede eksempel (som jeg begyndte at bruge dine rigtige tabelnavne, men det er de originale data) kan du få alle ruterne gennem flere switches med:

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

hvoraf den ene har en ende-til-ende-rute fra sektion 54 til 700; og du kan derefter forbinde det med belastningsdefinitionen:

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

Eller hvis du skal inkludere busnumber i logikken (baseret på et kort kig på din større forespørgsel...):

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

Tilføjelse af dine andre tabeller vil naturligvis komplicere tingene en smule, men det er ikke helt klart, hvordan de alle er relateret.




  1. Hvordan kan jeg bruge MySQL-database fra to forskellige servere i PHP?

  2. Find ud af, om et objekt er en funktion med tabelværdi i SQL Server med OBJECTPROPERTY()

  3. Problem med MySQL multiple table join-forespørgselsydeevne

  4. Problem med MySql INSERT MAX()+1