2016-10-24 9 views
0

CTEを使用してすべての子ノード(現在のノードを含む)をSQLで取得する例が多数あります。簡単な例は次のとおりです。SQLで指定されたノードの親ノードと子ノードをすべて検索するクエリ

;WITH #results AS 
(
    SELECT ChildId, 
      ParentId 
    FROM History 
    WHERE ChildId= @selected 
    UNION ALL 
    SELECT t.ChildId, 
      t.ParentId 
    FROM History t 
      INNER JOIN #results r ON r.ExpirationList = t.ParentId 
) 
SELECT * 
FROM #results; 

上記のクエリは、私に特定のノードのすべての子ノードを与えます。 - > B - > C - > D - > Eと私は= "C"、そして、私はCとして結果を得る@selected渡す - 私の質問はどのようにある> E.

- > D A:例えばのために私が何を渡すかにかかわらず、完全なチェーンを手に入れますか? @selected = "D"の場合は、結果をA - > B - > C - >D - > Eおよび とすると、結果はA - > Bとなります。 - > C - >D - > E.

私は、指定されたノードの親ノードと子ノードの両方が必要です。誰かが同じ質問をしてくれますか?

答えて

0

これは動作するはずです:

;WITH #results1 AS 
(
    SELECT ChildId, 
      ParentId 
    FROM History 
    WHERE ChildId= @selected 
    UNION ALL 
    SELECT t.ChildId, 
      t.ParentId 
    FROM History t 
      INNER JOIN #results1 r ON r.ExpirationList = t.ParentId 
) 
,#results2 AS 
(
    SELECT ChildId, 
      ParentId 
    FROM History 
    WHERE ChildId= @selected 
    UNION ALL 
    SELECT t.ChildId, 
      t.ParentId 
    FROM History t 
      INNER JOIN #results2 r ON t.ExpirationList = r.ParentId 
) 
SELECT * 
FROM #results1 
UNION 
SELECT * 
FROM #results2 
+0

あなたの提案に感謝しています。しかし、それは無限回帰に入った。 –

+0

これは私が受け取ったエラーメッセージです。 ステートメントが終了しました。文の完了前に最大再帰32767が使い尽くされました。 –

+0

私は答えを変更した - 謝罪、それは無限再帰を引き起こしていた右手を。上記のように、これを防ぐために2つの別個のCTEを使用する必要があります。次に、それらを組み合わせるために共用体を使用します。 – Chriz

関連する問題