次の列を含むItemsというテーブルを持つデータベースがあります。
- ID-主キー、uniqueidentifier
- 名前-nvarchar(256)
- ParentID-uniqueidentifier
名前フィールドは、ルートアイテムである「11111111-1111-1111-1111-111111111111」と等しくなるまで各ParentIdを反復処理することにより、アイテムへのパスを構築するために使用できます。
したがって、次のような行を持つテーブルがある場合
ID Name ParentID
-------------------------------------------------------------------------------------
11111111-1111-1111-1111-111111111112 grandparent 11111111-1111-1111-1111-111111111111
22222222-2222-2222-2222-222222222222 parent 11111111-1111-1111-1111-111111111112
33333333-3333-3333-3333-333333333333 widget 22222222-2222-2222-2222-222222222222
したがって、上記の例でIDが「33333333-3333-3333-3333-333333333333」のアイテムを検索した場合、パスが必要になります
/grandparent/parent/widget
戻ってきた。私はCTEを書き込もうとしましたが、それは通常このようなことを達成する方法のように見えますが、SQLをあまり実行しないため、どこが間違っているのかよくわかりません。私はいくつかの例を見てきましたが、これは私が得ることができるように見える限り近いです-これは子行のみを返します。
declare @id uniqueidentifier
set @id = '10071886-A354-4BE6-B55C-E5DBCF633FE6'
;with ItemPath as (
select a.[Id], a.[Name], a.ParentID
from Items a
where Id = @id
union all
select parent.[Id], parent.[Name], parent.ParentID
from Items parent
inner join ItemPath as a
on a.Id = parent.id
where parent.ParentId = a.[Id]
)
select * from ItemPath
パスのローカル変数をどのように宣言し、再帰クエリで追加し続けるのかわかりません。その後に進む前に、少なくともすべての行を親に渡そうとしました。誰かがそれを手伝ってくれるなら-私はそれをいただければ幸いです。