sql >> データベース >  >> RDS >> Oracle

ノードをトレースするために、複数のテーブルを含むsqlplusで関連する再帰サブクエリを作成するにはどうすればよいですか?

    簡略化した例(実際のテーブル名を使用し始めましたが、これは元のデータです)では、次の方法で複数のスイッチを介してすべてのルートを取得できます。

    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
    

    そのうちの1つには、セクション54から700までのエンドツーエンドルートがあります。そして、それを負荷定義に結合できます:

    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
    

    または、busnumberを含める必要がある場合 ロジック内(より大きなクエリを簡単に見て...):

    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<>フィドル

    他のテーブルを追加すると、明らかに少し複雑になりますが、それらがすべてどのように関連しているかは明確ではありません。




    1. xlsデータをmysqlデータベースにインポートするためのJavaコード

    2. 共有列にマスターテーブルを使用することは、データベース全体の良い習慣ですか?

    3. WebアプリケーションのJavaからOracleNLS_LANGUAGEを設定します

    4. Wampを再インストールするときにMySQLデータベースを復元する