1

t1、t2、t3の3つのテーブルがあります。

t1-階層テーブル(idとparent_idを持つ)

t1はt2に接続され、t2はt3に接続されます(結合)

入力:t1のいくつかのID

これらの識別子にツリーを構築する必要があります(すべての親ノードを収集するため)

次に、t2とt3をくっつけて、木を下に構築します

親のトップスの子のt3name(t3から)の値を復元することも必要です。

出力:各t3nameの階層ツリーを受信する必要があります

私のSQLリクエストですが、非常に遅いです:

ミニ例: http ://sqlfiddle.com/#!4 / 0b607 / 2

SELECT id, name, t3name FROM 
(SELECT distinct t1.id as id, 
                 t1.parent as parent, 
           t1.name as name, 
           connect_by_root(t3.name) as t3name
    FROM table1 t1
    LEFT OUTER JOIN table2 t2
        ON t1.t2_id = t2.id
    LEFT OUTER JOIN table3 t3
        ON t2.t3_id = t3.id
    START WITH t1.id in (83, 98, 9, 19, 4, 101)
        CONNECT BY PRIOR t1.parent = t1.id)
WHERE t3name IS NOT NULL
START WITH parent = 0
    CONNECT BY PRIOR id = parent and PRIOR t3name = t3name
4

1 に答える 1

1

実行プランを見ずにクエリを調整するのを手伝うのは少し難しいですが、私があなたを正しく理解しているなら、の値に対してのみ2つの結合が必要ですt3name

その場合は、最初にtable1から階層データを取得し、その結果をtable2とtable3に結合してみてください。

このようにしてみてください:

SELECT id, name, t3name FROM 
(SELECT distinct t1.id as id, 
                 t1.parent as parent, 
           t1.name as name, 
           t3.name as t3name
    FROM (select tt1.name, tt1.id, tt1.parent, connect_by_root(tt1.t2_id) t2_id
         from table1 tt1 
         START WITH tt1.id in (83, 98, 9, 19, 4, 101)
        CONNECT BY PRIOR tt1.parent = tt1.id) t1
    JOIN table2 t2
        ON t1.t2_id = t2.id
    JOIN table3 t3
        ON t2.t3_id = t3.id
    )
WHERE t3name IS NOT NULL
START WITH parent = 0
    CONNECT BY PRIOR id = parent and PRIOR t3name = t3name; 

私はあなたのフィドルにいくつかの主キーを追加し(インデックスを使用できるかどうかを確認するため)、両方のクエリを配置しました。こちらをご覧ください

于 2012-10-03T13:22:37.847 に答える