16

頭が回らないという問題があります。私は自分が何を望んでいるのかを知っていますが、それを画面に表示することはできません。私が持っているのは次のようなテーブルです:

Id, PK UniqueIdentifier, NotNull
Name, nvarchar(255), NotNull
ParentId, UniqueIdentifier, Null

ParentIdにはFKからIdがあります。

私が達成したいのは、渡したIDの下にあるすべてのIDのフラットリストを取得することです。

例:

1   TestName1    NULL
2   TestName2    1
3   TestName3    2
4   TestName4    NULL
5   TestName5    1

ツリーは次のようになります。

-1
  -> -2
       -> -3
  -> -5
-4

今4を要求すると、4だけが返されますが、1を要求すると、1、2、3、および5を取得します。2を要求すると、2と3を取得します。

私を正しい方向に向けることができる人はいますか?私の脳は揚げられているので、私が得ることができるすべての助けに感謝します。

4

5 に答える 5

23
declare @T table(
  Id int primary key,
  Name nvarchar(255) not null,
  ParentId int)

insert into @T values
(1,   'TestName1',    NULL),
(2,   'TestName2',    1),
(3,   'TestName3',    2),
(4,   'TestName4',    NULL),
(5,   'TestName5',    1)

declare @Id int = 1

;with cte as
(  
  select T.*
  from @T as T
  where T.Id = @Id
  union all
  select T.*
  from @T as T
    inner join cte as C
      on T.ParentId = C.Id
)
select *
from cte      

結果

Id          Name                 ParentId
----------- -------------------- -----------
1           TestName1            NULL
2           TestName2            1
5           TestName5            1
3           TestName3            2
于 2011-04-13T12:55:06.017 に答える
6

実例は次のとおりです。

declare @t table (id int, name nvarchar(255), ParentID int)

insert @t values
(1,   'TestName1',    NULL),
(2,   'TestName2',    1   ),
(3,   'TestName3',    2   ),
(4,   'TestName4',    NULL),
(5,   'TestName5',    1   );

; with rec as
        (
        select  t.name
        ,       t.id as baseid
        ,       t.id
        ,       t.parentid
        from    @t t
        union all
        select  t.name
        ,       r.baseid
        ,       t.id
        ,       t.parentid
        from    rec r
        join    @t t
        on      t.ParentID = r.id
        )
select  *
from    rec
where   baseid = 1

でフィルタリングできますbaseid。これには、クエリしているツリーの開始が含まれます。

于 2011-04-13T12:53:31.003 に答える
3

これを試して:

WITH RecQry AS
(
    SELECT *
      FROM MyTable
    UNION ALL
    SELECT a.*
      FROM MyTable a INNER JOIN RecQry b
        ON a.ParentID = b.Id
)
SELECT *
  FROM RecQry
于 2011-04-13T12:51:00.327 に答える
0

これは、階層IDモデルに関する優れた記事です。データの開始からクエリの設計に至るまでです。

また、共通テーブル式を使用して再帰クエリを使用することもできます。

于 2011-04-13T12:48:59.483 に答える
0

探していることを達成する最も簡単な方法は、共通テーブル式を使用して再帰クエリを作成することだと思います。

MSDN-一般的なテーブル式を使用した再帰クエリ

于 2011-04-13T12:49:40.803 に答える