给定一个自引用表
Item
-------------
Id (pk)
ParentId (fk)
与相关值的相关表
ItemValue
-------------
ItemId (fk)
Amount
还有一些样本数据
Item ItemValues
Id ParentId ItemId Amount
-------------------- ----------------------
1 null 1 10
2 1 3 40
3 1 3 20
4 2 4 10
5 2 5 30
6 null
7 6
8 7
我需要一个存储程序来接送Item.Id
直属孩子,并ItemValue.Amounts
为他们,他们的孩子和他们的孩子一路走来。
例如,如果1
传入,则树将是2, 3, 4, 5
直接子代2, 3
,输出将是
ItemId Amount
------------------
2 40 (values from ItemIds 4 & 5)
3 60 (values from ItemId 3)
应该采用哪种方法来实现此行为?
我正在考虑使用CTE,但想知道是否有更好/更快的方法。
假设您的层次结构不算太深,这样的递归CTE将可以工作:
declare @ParentId int;
set @ParentId = 1;
;with
Recurse as (
select
a.Id as DirectChildId
, a.Id
from Item a
where ParentId = @ParentId
union all
select
b.DirectChildId
, a.Id
from Item a
join Recurse b on b.Id = a.ParentId
)
select
a.DirectChildId, sum(b.Amount) as Amount
from Recurse a
left join ItemValues b on a.Id = b.ItemId
group by
DirectChildId;
非CTE方法将需要某种形式的迭代,基于游标或其他方式。由于它是存储的proc,因此有可能,并且如果要递归处理大量数据,则只要适当地对数据进行切片,它的伸缩性可能会更好。
如果聚集索引位于Id上,请在ParentId上添加非聚集索引。作为覆盖索引,它将满足不使用书签查找的初始搜索。然后,聚簇索引将有助于递归联接。
如果聚集索引已位于ParentId上,则在ID上添加非聚集索引。在一起,它们实际上将等同于上述内容。对于ItemValues,如果实际表的宽度大于此值,则可能需要在(ItemId)INCLUDE(Amount)上建立索引。
本文向大家介绍javascript中数组方法汇总,包括了javascript中数组方法汇总的使用技巧和注意事项,需要的朋友参考一下 js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined unshift:将参数添加到原数组开头,并返回数组的长度 注:在IE6.0下测试返回值
关于如何利用函数汇总表的数据。 聚集函数 确定表中的行数 获得表中行组的和 找出表列(所有行,特定行)的最大,最小,平均值。 上面的例子需要对表中的数据汇总,而不是实际数据本身,所以可以不需要返回时间数据,浪费资源 聚集函数(aggregate function) 运行在行组上,计算和返回单个值的函数。 AVG(): 返回所有列或者某个列平均值。 计算表中的行数并计算特定列值之和,求得改列的平均值
本文向大家介绍javascript数组去重方法汇总,包括了javascript数组去重方法汇总的使用技巧和注意事项,需要的朋友参考一下 javascript数组去重方法汇总 其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。 而第2中方法用的是has
本文向大家介绍js数组去重的方法汇总,包括了js数组去重的方法汇总的使用技巧和注意事项,需要的朋友参考一下 三种方法 利用indexOf判断新数组 underscore.js中实际上也是使用的类似的indexOf 利用indexOf判断旧数组 利用hash查找 这里利用了JS对象的实现就是hash表的特性 数组扩展 使用Set Set和Map是ES6中新增的数据结构 Set直接可以存储不重复的一组
本文向大家介绍javascript数组去重的方法汇总,包括了javascript数组去重的方法汇总的使用技巧和注意事项,需要的朋友参考一下 四种算法来实现这个目的: 第一种: 第二种: 第二种改进版: 第三种: 其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所
本文向大家介绍angular.element方法汇总,包括了angular.element方法汇总的使用技巧和注意事项,需要的朋友参考一下 addClass()-为每个匹配的元素添加指定的样式类名 after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点 append()-在每个匹配元素里面的末尾处插入参数内容 attr() - 获取匹配的元素集合中的第一个元素的属性的值