爲了速度的原因,我需要將一些代碼從C#移動到一個存儲過程。我想要得到的是基於CategoryId的RoleTemplates(或者CategoryToRoleTemplate)表格中的TemplateIds的唯一列表。
但是,我需要查詢漫步Category.ParentId關係,並收集所有父級的相關TemplateIds。這需要發生,直到ParentId爲空。Sql遞歸查詢來創建一個唯一的列表
理想情況下,結果應該是RoleTemplate.TemplateIds的唯一列表。
表結構...
Categories
------------------------------
CategoryId uniqueidentifier
ParentId uniqueidentifier <-- Relationship to Categories.CategoryId.
Name varchar (50)
CategoryToRoleTemplate
------------------------------
CategoryId uniqueidentifier <-- Relationship to Categories.CategoryId.
TemplateId uniqueidentifier <-- Relationship to RoleTemplates.TemplateId.
RoleTemplates
------------------------------
TemplateId uniqueidentifier
Name varchar (50)
我使用SQL Server 2008 R2。
謝謝!
編輯:
最終的解決方案:
with CategoryHierarchy (ParentId)
as (
-- Anchor member definition
select CategoryId from Categories
where CategoryId = @id
union all
-- Recursive member definition
(select c.ParentId from Categories as c
inner join CategoryHierarchy as p
on c.CategoryId = p.ParentId)
)
select distinct TemplateId from CategoryToRoleTemplates where CategoryId in (select CategoryId from CategoryHierarchy);
感謝所有誰回答! CTE是關鍵。