2

メニュー項目のツリー構造を構築するために使用されるテーブルがあります。このテーブルのサンプル コンテンツは次のとおりです。

Parent      Child
------      ------
190         192
192         180
180         185
185         184
190         191
191         197
197         200

子IDを含む階層に表示される順序で親レコードのカンマ区切りリストを提供するクエリが必要です。

  • 子 ID が 184 の場合、190、192、180、185、184 を返す必要があります。
  • 子 ID が 200 の場合、190、191、197、200 が返されます。
4

3 に答える 3

0

コンマ区切りのリストが必要な場合は、再帰 cte を使用して簡単に行うことができます。

with cte as (
    select
        t.Parent, 1 as Level,
        cast(t.Parent as nvarchar(max)) + ',' + cast(t.Child as nvarchar(max)) as Path
    from Table1 as t
    where t.Child = @Child

    union all

    select
        t.Parent, Level + 1 as Level,
        cast(t.Parent as nvarchar(max)) + ',' + c.Path as Path
    from Table1 as t
        inner join cte as c on c.Parent = t.Child
)
select top 1 Path
from cte
order by Level desc

sql fiddle demo

于 2013-09-28T04:53:47.267 に答える
0

デモンストレーションのために、テーブル変数を使用しました。標準テーブルを使用するには、@tempTable宣言を削除してステートメントを挿入します。@tempTable次に、参照をテーブル名に 置き換えます。

declare @childId int
set @childId = 184

declare @tempTable table(parent int, child int)

insert into @tempTable values(190, 192)
insert into @tempTable values(192, 180)
insert into @tempTable values(180, 185)
insert into @tempTable values(185, 184)
insert into @tempTable values(190, 191)
insert into @tempTable values(191, 197)
insert into @tempTable values(197, 200)

declare @currentItem int
set @currentItem = @childId

declare @output varchar(max)
set @output = cast(@currentItem as varchar)

while (exists(select 1 from @tempTable where child = @currentItem))
begin
    select 
        @currentItem = parent
    from 
        @tempTable 
    where 
        child = @currentItem

    set @output = cast(@currentItem as varchar) + ', ' + @output 
end

select @output

出力例:

184 の場合:190, 192, 180, 165, 184

200 の場合:190, 191, 197, 200

于 2013-09-28T03:18:35.030 に答える