我是递归CTE概念的新手,手头有一个问题,我觉得这个问题可以通过使用递归CTE来解决。让我知道你们的想法。
两张桌子:
表一是自引用位置表,其中包含ID
,ParentID
,Level
和Description
。
表2是一个资产表,它记录了各个资产,并且具有位置表ID
字段的外键。
Table1:
ID Description ParentID Level
1 Site1 NULL 1
2 Site2 NULL 1
3 Building1 1 2
4 Building2 1 2
5 Floor1 3 3
6 Floor2 3 3
7 Floor3 4 3
8 Place1 5 4
9 Place2 7 4
Table2:
ID Description Quantity LocationID
1 Desk 3 8
2 Lamp 1 8
3 PC 10 9
我想创建一个输入参数为@Level
的存储过程,并返回该级别的所有位置记录以及该位置内的资产数量(包括子级别)。
例如,如果@Level = 3,则存储过程应返回:
ID Description AssetCount
5 Floor1 4
6 Floor2 0
7 Floor3 10
如果@Level = 2,则存储过程应返回:
ID Description AssetCount
3 Building1 4
4 Building2 10
如果问题不明确,请告诉我。
答案 0 :(得分:3)
嗯,这里没什么特别的,只是一个递归的CTE加入了另一个表,结果就是你所期望的:
declare @level int = 3
;with CTE as (
select id as origid, id, Description, parentid
from table1 where level = @level
union all
select CTE.origid, t1.id, CTE.Description, t1.parentid
from CTE join table1 t1 on
CTE.id = t1.parentid
)
select origid, CTE.description, isnull(sum(t2.Quantity),0) as Quantity
from CTE left outer join table2 t2 on CTE.id = t2.locationid
group by origid, CTE.description