7

次の階層ツリーテーブルがあります

GO
DROP TABLE #tbl 
GO
CREATE TABLE #tbl (Id int , ParentId int)
INSERT  INTO #tbl (Id, ParentId) VALUES  (0, NULL)
INSERT  INTO #tbl (Id, ParentId) VALUES  (1, 0)
INSERT  INTO #tbl (Id, ParentId) VALUES  (2, 1)
INSERT  INTO #tbl (Id, ParentId) VALUES  (3, 1)
INSERT  INTO #tbl (Id, ParentId) VALUES  (4, 2)
INSERT  INTO #tbl (Id, ParentId) VALUES  (5, 2)
INSERT  INTO #tbl (Id, ParentId) VALUES  (6, 3)
INSERT  INTO #tbl (Id, ParentId) VALUES  (7, 3)
GO

次のツリーにマップされるもの

0
+- 1
   +- 2
      +- 4
      +- 5
   +- 3
      +- 6
      +- 7

CTE 再帰テーブルを使用して、選択したノードのパスとすべての子を取得するにはどうすればよいですか。たとえば2、入力として、次のデータを取得するにはどうすればよいですか (可能な場合は順序付け)

Id, ParentID
-------
 0, NULL 
 1, 0
 2, 1
 4, 2
 5, 2

次のステートメントでツリーを上に移動できることを知っています(パスを取得)

WITH RecursiveTree AS (
    -- Anchor
    SELECT *
        FROM #tbl
        WHERE Id = 2
    UNION ALL
        -- Recursive Member
        SELECT Parent.*
        FROM 
            #tbl AS Parent
            JOIN RecursiveTree AS Child ON Child.ParentId = Parent.Id
)
SELECT * FROM RecursiveTree

そして、次のステートメントで、ツリーを下にトラバースします (すべての子を取得します)。

WITH RecursiveTree AS (
    -- Anchor
    SELECT *
        FROM #tbl
        WHERE Id = 2
    UNION ALL
        -- Recursive Member
        SELECT Child.*
        FROM 
            #tbl AS Child
            JOIN RecursiveTree AS Parent ON Child.ParentId = Parent.id
)
SELECT * FROM RecursiveTree

質問:これら 2 つのコマンドを 1 つに結合するにはどうすればよいですか?

4

1 に答える 1

4

これら2つの選択のUNIONを使用するだけです

SQLFiddle デモ

WITH RecursiveTree AS (
    -- Anchor
    SELECT *
        FROM #tbl
        WHERE Id = 2
    UNION ALL
        -- Recursive Member
        SELECT Parent.*
        FROM 
            #tbl AS Parent
            JOIN RecursiveTree AS Child ON Child.ParentId = Parent.Id
),
RecursiveTree2 AS
(
    -- Anchor
    SELECT *
        FROM #tbl
        WHERE Id = 2
    UNION ALL
        -- Recursive Member
        SELECT Child.*
        FROM 
            #tbl AS Child
            JOIN RecursiveTree2 AS Parent ON Child.ParentId = Parent.id
)
select * from
(
SELECT * FROM RecursiveTree
union
SELECT * FROM RecursiveTree2
) t
order by id
于 2013-02-13T08:51:32.590 に答える