概要
Azureデータベース(SQL Server Management Studio 17、つまりT-SQLを使用)で、長さの異なる複数の親子関係を連結しようとしています。
ベーステーブル
私のテーブルは次の形式です。
ID parent
1 2
2 NULL
3 2
4 3
5 NULL
このコードを自由に使用して生成し、入力してください。
DECLARE @t TABLE (
ID int,
parent int
)
INSERT @t VALUES
( 1, 2 ),
( 2, NULL ),
( 3, 2 ),
( 4, 3 ),
( 5, NULL )
問題
次の表に示すように、パスが連結されたテーブルを受け取るにはどうすればよいですか?
ID path parentcount
1 2->1 1
2 2 0
3 2->3 1
4 2->3->4 2
5 5 0
詳細
実際のテーブルにはさらに多くの行があり、最長のパスには最大15個のIDが含まれている必要があります。したがって、親カウントの定義の観点から動的なソリューションを見つけることが理想的です。また、「parentcount」列は必ずしも必要ではないので、回答ではスキップしてください。
select @@version:
Microsoft SQL Azure (RTM) - 12.0.2000.8
これには再帰CTEを使用できます。
with cte as (
select id, parent, convert(varchar(max), concat(id, '')) as path, 0 as parentcount
from @t t
union all
select cte.id, t.parent, convert(varchar(max), concat(t.id, '->', path)), parentcount + 1
from cte join
@t t
on cte.parent = t.id
)
select top (1) with ties *
from cte
order by row_number() over (partition by id order by parentcount desc);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加