2

私はエンティティの基本的なツリー構造を持っています。ツリーの深さは最大5ノードですが、幅はNノードの場合があります。この関係を、以下に示すような表にマッピングしました。

myID | myDescription | myParentID

私は既知のオブジェクトから始めています。これは、「myID」で始まることを意味します。次に、すべての子ノードを取得します。1つのステートメントですべての子ノードを取得する方法はありますか?これには、私の子供たちの子供たちを含める必要があります。OracleSQLを使用しています。

ありがとう、ジェイ

4

3 に答える 3

4
SELECT  *
FROM    mytable
START WITH
        myid = :id
CONNECT BY
        myparentid = PRIOR myid
于 2009-08-26T17:27:56.837 に答える
0

単一のクエリですべてのノードを取得する場合は、別の方法を使用して階層をモデル化することをお勧めします。非常に優れた一般的な実装の1つは、入れ子集合モデルです。この記事では、これがMySQLでどのように実装されるかについて概説していますが、Oracleに簡単に移植できます。

于 2009-08-26T17:29:53.447 に答える
0

これを実装するための可能な適切な方法は、レコードへの「パス」を含む別のフィールドを追加することです。トップレコードがID=1だとします。ID = 5の子があり、ID = 20の子がある場合、最後のレコードのパスは/ 1/5/20になります。したがって、最上位ノードのすべての子ノードが必要な場合は、次のようにします。

select * from MyTable where Path like '/1/%'

(申し訳ありませんが、SQLサーバーの構文です。私はOracle開発者ではありませんが、概念は引き続き適用されます)

ミドルノードの子を取得するには

select * from MyTable where Path like '/1/5/%'

このソリューションの優れた点は、「パス」フィールドにインデックスを適用できることです。そのため、ステートメントは1回のインデックススキャンのみを使用して実行され、非常に効率的です。

于 2009-08-26T17:42:35.077 に答える