2

DBに保存しようとしているツリーがあります。現在、各行は次のようになっています

ID, Child1, Child2, Child3, NodeValue

ID を参照する外部キーとして Child1、Child2、および Child3 があります。

私がやりたいことは、ノードを指定して、そのノードとそのすべての子孫を取得することです(「サブツリー」だと思います)。ただし、ノードの深さを 4 ~ 7 程度に制限したいと考えています。

誰かがいくつかの指針を持っていますか?

編集:

次に例を示します。

ID   C1   C2   C3
1    10   52   32
2    NULL NULL NULL
3    4    5    6
4    2    NULL NULL
5    NULL NULL NULL
6    NULL NULL NULL
10   3    NULL NULL
52   NULL NULL NULL
32   NULL NULL NULL

行 1 で深さ 2 のクエリが必要な場合、ID が 1 、10、52、32、および 3 の行が返されますが、2、4、5、または 6 は返されません。

4

1 に答える 1

2

SQLServer2005+ で再帰 CTE を使用する

;WITH cte AS
 (
 SELECT ID, C1, C2, C3, 0 AS [Level]
 FROM dbo.test7
 WHERE ID = 1 -- @your root node
 UNION ALL
 SELECT t.ID, t.C1, t.C2, t.C3, c.[Level] + 1
 FROM dbo.test7 t JOIN cte c ON t.ID IN (c.C1, c.C2, c.C3)
 WHERE c.[Level] + 1 <= 2 --@your_depth
 )
 SELECT ID, C1, C2, C3
 FROM cte

SQLFiddle のデモ

于 2013-01-15T07:36:36.133 に答える