1

connect by を使用して問題に直面しています。

次の 3 つを含むいくつかの列を取得するクエリがあります。

  • ID
  • 親ID
  • オブジェクト ID

同じIDandに対してparentID、複数のオブジェクトが関連付けられています。

ID ParentID ObjectID
1 0 112
1 0 113
2 0 111
2 0 112
3 1 111
4 1 112

使用しようとしていますconnect byが、適切な階層で結果を取得できません。以下に示すように必要です。ID-parentIDコンボを取り、それを含むすべての行を表示しID-parentID、次にこれのすべての子を表示しますID。つまり、parentID= ID

ID ParentID ObjectID
1 0 112
1 0 113
3 1 111
4 1 112
2 0 111
2 0 112

select ID,parent_id, object_id from table start with parent_id=0 
connect by prior id=parent_id order by id,parent_id

上記のクエリでは、必要な適切な階層が得られません。

4

3 に答える 3

4

問題は、正規化されていないテーブル デザインを使用していることにあるようです。与えられたIDが常に同じである場合ParentID、その関係をこれらすべての行で個別に示すべきではありません。

より良い設計は、主キーとしての親子関係を示す単一のテーブルと、 toIDのマッピングを示す 2 つ目のテーブルを持つことです。ここで、両方の列が一緒になって主キーを構成すると仮定します。次に、最初のテーブルに対して階層クエリを適用し、その結果を他のテーブルに結合して、各行に関連するオブジェクトを取得します。IDObjectID

これを現在のテーブル構造でエミュレートできます...

with parent_child as (select distinct id, parent_id from table),
     tree as (select id, parent_id from parent_child
               start with parent_id = 0
               connect by prior id = parent_id )
select id, table.parent_id, table.object_id
  from tree join table using (id)
于 2012-06-21T17:47:18.627 に答える
0

実行するスクリプトは次のとおりです。理想的ではありませんが、機能します-

select * from (select distinct test.id,
                    parent_id,
                    object_id,
                    connect_by_root test.id root
      from test
     start with test.parent_id = 0
    connect by prior test.id = parent_id)
order by root,id
于 2012-06-21T18:05:28.590 に答える
0

まず最初に、私を助けてくれたすべての人に感謝します。

最後に、複数の結合を使用して階層 CONNECT BY 句を内部クエリに適用してもうまくいかなかったため、アプローチを変更しました。

私は次のアプローチを取った

  1. 最初のテーブル、つまり ID-ParentID を持つテーブルから階層データを取得します。CONNECT BY を使用してクエリ table1 を選択します。適切な順序でIDを提供します。取得した ID のリストに参加します。

  2. 上記の ID を select query IN 句のコンマ区切り文字列として、ID-ObjectID を持つ 2 番目のテーブルに渡します。

select * from table2 where ID in (上記の結合された ID 文字列) order by instr('上記の結合された ID 文字列',ID);

ORDER BY INSTR魔法をしました。IN句データで並べ替えられた結果が得られ、階層クエリを使用してIN句文字列が準備されます。したがって、それは明らかに順番になります。

再び助けてくれてありがとう!

注: 上記のアプローチには 1 つの制約があります。ID は、IN 句でカンマ区切りの文字列として渡されます。IN句は文字数制限があります。私は1000文字だと思います。わからない。しかし、最初のテーブルのデータでは、1000文字の制限を超えることはないと確信しています。したがって、上記のアプローチを選択しました。

于 2012-06-22T09:35:00.087 に答える