3

以下は、検索文字列に一致するノードがないツリーの剪定を行わない、このクエリの完全なデータ セットの例です。

レベルの親 ID テキスト
----------------------------------------------
0 0 1 トップレベル
1 1 2 フー
1 1 3 サムシン エルス
1 1 4 フー
0 0 7 トップレベル2
1 7 8 セカンドレベル
1 7 9 アナザーセカンドレベル

ユーザーが「foo」を検索した場合、次を返す必要があります。

0 0 1 トップレベル
1 1 2 フー
1 1 4 フー

実際のケースはもう少し複雑です (つまり、ツリー内の 3 つのレベルを返したい) が、これで問題を捉えることができます。英語では、テキスト列の一致するノードから始まる検索文字列に一致するノードの祖先ツリーを返し、すべての祖先を返します。

私はOracleを初めて使用し(少なくとも最近)、成功せずにCONNECT BY句に追加しようとしました-常に次を返します:

1 1 2 フー
1 1 4 フー

PS - これに関するオラクルのドキュメントと例は、 CONNECT_BY_ROOT が祖先をキャプチャすることを暗示していますが、トップレベル (ROOT) の値を返すだけのようです。

4

3 に答える 3

3

ボトムアップからトラバースするには、重要なビットはCONNECT BY PRIOR) の後の値の順序です。 )order byは出力を逆にするために使用され (ルートは foo であるため)、distinctは重複するトップレベルの値を削除します。

SELECT DISTINCT LEVEL, id, text
FROM t1
CONNECT BY PRIOR parent = id
START WITH text = 'foo'
ORDER BY LEVEL DESC

注: 子を foo に追加し、CONNCT BY PRIOR id = 親を切り替えると、子が取得されます。

階層全体を見たい場合は、ツリーの一番上を見つけることができます(親のない行を探すことによって)

SELECT id
FROM t1
WHERE parent=0
CONNECT BY PRIOR parent = id
START WITH text = 'foo'

次に、これを START WITH id として使用します (そして、外側のクエリでツリー トラバーサルの順序を逆にします。id = 親):

SELECT DISTINCT LEVEL, id, text
FROM t1
CONNECT BY PRIOR id = parent
START WITH id IN 
(
    SELECT id
    FROM t1
    WHERE parent=0
    CONNECT BY PRIOR parent = id
    START WITH text = 'foo'
)
ORDER BY LEVEL DESC
于 2011-10-13T14:25:17.677 に答える
0

LEVEL列の使用に応じて(私のコメントに従って)。

Oracle 階層クエリに関する情報: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries003.htm

これは、LEVEL が Oracle 疑似列である場合に求めるものを返します。

WITH t AS (SELECT 0 AS parent,
                  1 AS id,
                  'toplevel' AS text FROM DUAL
           UNION
           SELECT 1 AS parent,
                  2 AS id,
                  'foo' AS text FROM DUAL
           UNION
           SELECT 1 AS parent,
                  3 AS id,
                  'sumthin else' AS text FROM DUAL
           UNION
           SELECT 1 AS parent,
                  4 AS id,
                  'foo' AS text FROM DUAL
           UNION
           SELECT 0 AS parent,
                  7 AS id,
                  'toplevel2' AS text FROM DUAL
           UNION
           SELECT 7 AS parent,
                  8 AS id,
                  'secondlevel' AS text FROM DUAL
           UNION
           SELECT 7 AS parent,
                  9 AS id,
                  'anothersecondlevel' AS text FROM DUAL
          ) 
SELECT UNIQUE
       level,
       parent,
       id,
       text
  FROM t
 START WITH text = 'foo'
 CONNECT BY PRIOR parent = id
 ORDER BY parent;

戻り値:

LEVEL PARENT ID TEXT
    2      0  1 toplevel
    1      1  2 foo     
    1      1  4 foo     

LEVEL がテーブルの列である場合:

WITH t AS (SELECT 0 AS tlevel,
                  0 AS parent,
                  1 AS id,
                  'toplevel' AS text FROM DUAL
           UNION
           SELECT 1 AS tlevel,
                  1 AS parent,
                  2 AS id,
                  'foo' AS text FROM DUAL
           UNION
           SELECT 1 AS tlevel,
                  1 AS parent,
                  3 AS id,
                  'sumthin else' AS text FROM DUAL
           UNION
           SELECT 1 AS tlevel,
                  1 AS parent,
                  4 AS id,
                  'foo' AS text FROM DUAL
           UNION
           SELECT 0 AS tlevel,
                  0 AS parent,
                  7 AS id,
                  'toplevel2' AS text FROM DUAL
           UNION
           SELECT 1 AS tlevel,
                  7 AS parent,
                  8 AS id,
                  'secondlevel' AS text FROM DUAL
           UNION
           SELECT 1 AS tlevel,
                  7 AS parent,
                  9 AS id,
                  'anothersecondlevel' AS text FROM DUAL
          ) 
SELECT UNIQUE
       tlevel,
       parent,
       id,
       text
  FROM t
 START WITH text = 'foo'
 CONNECT BY PRIOR parent = id
 ORDER BY parent;

戻り値:

TLEVEL PARENT ID TEXT
     0      0  1 toplevel
     1      1  2 foo     
     1      1  4 foo     

それが役に立てば幸い...

于 2011-10-13T14:11:25.120 に答える