【发布时间】:2015-07-24 21:53:13
【问题描述】:
我是递归 CTE 概念的新手,手头有一个问题,我有一种小小的感觉,即使用递归 CTE 可以解决问题。让我知道你们的想法。
两个表:
表一是带有ID、ParentID、Level 和Description 的自引用位置表。
表二是一个资产表,它记录了单个资产,并有一个外键指向位置表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
如果问题不清楚,请告诉我。
【问题讨论】:
-
我不确定我理解为什么你需要递归地做某事。你问的不等于
select a.ID, a.Description, b.Quantity as AssetCount from table1 a inner join table2 b on a.id = b.id where a.level = @level吗? -
@Xedni 不是。需要递归来获取每个父级的子行;您的示例查询只会对父 ID 的数量求和,而不包括子 ID。
-
Xedni 感谢您的建议,但我认为 jpw 是正确的,JamesZ 提供的答案是正确的,这是一种获得结果的优雅方式!我只能想到使用临时表的方法......
标签: sql-server recursion common-table-expression