0

次のような階層を表すOracle自己参照テーブルがあります。

THING
---------
ID
PARENT_ID
NAME
SOME_DATA

トップレベルTHINGには。がありnull PARENT_IDます。

このテーブルから選択して、階層内の各行の位置(上から下)でデータを並べ替え、次にデータセットが次のようになるような名前で並べ替えることができるようにしたいと思います。

ID PARENT_ID  NAME SOME_DATA
1       null   top      null
2          1   cat      null
3          1   dog      null
4          2  frog      null
5          1  bird      null
6          2  fish      null

...になります:

ID PARENT_ID  NAME SOME_DATA
1       null   top      null
5          1  bird      null
2          1   cat      null
6          2  fish      null
4          2  frog      null
3          1   dog      null

この質問を入力し始めたとき、テーブルに列を追加せずにこれを行う方法があるかどうかについて興味がありましたがLEVEL、今ではその列を追加することでそれができるかどうかさえわかりません。

私はJavaコードでこれを行わなければならないという事実にすでに辞任しているので、ここでは「いいえ」の答えは完全に受け入れられます。

4

1 に答える 1

2

LEVEL結果を巧妙な方法で使用して管理しようとする代わりに、次の方法を使用START WITHORDER SIBLINGS BYて、探している結果を取得することができます。

SQLフィドル

SELECT t.*
FROM thing t
CONNECT BY PRIOR t.id = t.parent_id
START WITH t.parent_id IS NULL
ORDER SIBLINGS BY t.name

結果

| ID | PARENT_ID | NAME | SOME_DATA |
-------------------------------------
|  1 |    (null) |  top |    (null) |
|  5 |         1 | bird |    (null) |
|  2 |         1 |  cat |    (null) |
|  6 |         2 | fish |    (null) |
|  4 |         2 | frog |    (null) |
|  3 |         1 |  dog |    (null) |

これは、ルート(parent_id IS NULL)から始めて階層を連鎖し、結果を並べ替えます。

于 2012-11-20T23:13:44.163 に答える