我有一個所謂的項目表,包含這些列的數據庫:在自引用表編寫一個遞歸SQL查詢
- ID - 主鍵,唯一標識符
- 名稱 - 爲nvarchar(256)
- PARENTID - 唯一標識符
名稱字段可以被用來構建出到項的路徑,通過各自的ParentId迭代,直到它等於「11111111-1111-1111-1111-111111111111」,這是一個根項目。
所以,如果你有一個表,有一個像
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
我不知道如何我會申報路徑的局部變量,並保留追加到它的遞歸查詢。在去之前,我會試着至少把所有的行都交給父母。如果任何人都可以提供幫助 - 我會很感激。
當我嘗試運行這些,我得到這個錯誤:'類型不錨和遞歸查詢的列「姓名」,「ItemPath」 .' 任何想法遞歸部分之間的匹配爲什麼? –
我能夠通過將兩個名稱字段都轉換爲nvarchar(255),thx來解決這個問題。 –
是的,我認爲在CTE視圖的第一部分中使用nvarchar(max)會更好,我已經更改了答案 –