2

次のテーブルがあるとしましょう

SectionID ParentIDSection DatumID
   1           NULL         1
   2            1           2
   3            1           3
   4            2           4

ここで、SectionID = 1 の下にあるすべての DatumID を選択したいふりをしましょう。たとえそれがその子孫の子の一部であっても、

SectionID DatumID
  1         1
  1         2
  1         3
  1         4

カーソルを使用して最初のテーブルを再帰的に明示的に反復せずにこれを行うことは可能ですか?

4

3 に答える 3

5

これは、再帰についての考え方とは逆の方向に進んでいたため、少し混乱しましたが、非常に単純なこの解決策を思いつきました。

;WITH Rollups AS (
    SELECT SectionId, ParentIdSection, DatumId
    FROM SectionDataTable
    UNION ALL
    SELECT parent.SectionId, parent.ParentIdSection, child.DatumId
    FROM SectionDataTable parent 
    INNER JOIN Rollups child ON child.ParentIdSection = parent.SectionId
)
SELECT *
FROM Rollups 
WHERE SectionID = 1

(必要なセクション ID に置き換えます)

于 2012-11-08T00:19:59.860 に答える
2
declare @demo table
(
    SectionId int not null primary key clustered
    , ParentId int null --foreign key references @demo(SectionId)
    , DatumId int
);

insert @demo
      select 1, null, 1
union select 2, 1, 2
union select 3, 1, 3
union select 4, 2, 4
union select 5, null, 5
union select 6, 5, 6
;

with demoHierarchy
as
(
    select SectionId
    , SectionId ParentId
    , SectionId OriginalAncestorId
    , DatumId
    from @demo
    where ParentId is null --remove this line if you want OriginalAncestorId to be AnyAncestorId (if that doesn't make sense, try it and see)

    union all

    select d.SectionId
    , d.ParentId
    , h.OriginalAncestorId
    , d.DatumId
    from @demo d
    inner join demoHierarchy h
    on d.ParentId = h.SectionId
    where d.ParentId is not null --implied by the join, but here to make it explicit
)
select OriginalAncestorId SectionId
, DatumId 
from demoHierarchy
where OriginalAncestorId = 1 --not needed given your sample data only contains this data, but required when you have multiple root ancestors

階層クエリの詳細については、http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/を参照してください。

于 2012-11-08T00:32:13.697 に答える
1

MS SQL 2008 では階層 ID を使用できます。SQL Server 2008 Hierarchy Data Type Performance?で相対的なパフォーマンスについて別の質問がありました。.

再帰的階層の処理に関する別のリファレンスを次に示します: http://www.bimonkey.com/2009/09/handling-recursive-hierarchies-in-sql-server/

于 2012-11-08T00:11:31.203 に答える