sql >> Database >  >> RDS >> Oracle

Hoe betrokken recursieve subquery te schrijven in sqlplus met meerdere tabellen om knooppunten te traceren?

In je vereenvoudigde voorbeeld (een soort van, ik begon je echte tabelnamen te gebruiken, maar het zijn de originele gegevens) kun je alle routes via meerdere schakelaars krijgen met:

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

waarvan er één een end-to-end route heeft van sectie 54 tot 700; en je kunt dat dan toevoegen aan de laaddefinitie:

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

Of als u het busnumber moet vermelden in de logica (gebaseerd op een korte blik op uw grotere vraag...):

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

Het toevoegen van uw andere tabellen zal de zaken natuurlijk wat ingewikkelder maken, maar het is niet helemaal duidelijk hoe ze allemaal met elkaar in verband staan.




  1. Hoe onzichtbare Unicode-tekens in psql / postgres weer te geven?

  2. Selecteer de tweede meest minimale waarde in Oracle

  3. Kan ik een database maken met PDO in PHP?

  4. selecteer optie om de tweede geselecteerde optie bij te werken op basis van door mysql ingevulde vervolgkeuzelijsten