日期:2011-05-02 15:21:00 来源:本站整理
UDF在层次型数据处理中的妙用之三[MSSQL防范]
本文“UDF在层次型数据处理中的妙用之三[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
UDF在层次型数据处理中的妙用
3、计算合计数和子树深度
目前来看几个需求诀窍才能办理的问题——假如不用递归就很难办理的问题.假定我们想要得到从指定管理员开始的特定子树下全部雇员的薪水总额.Listing 4显示了若何用dbo.ufn_GetSubtreeSalary函数来完成这个任务.
LISTING 4:计算子树的合计数
CREATE FUNCTION dbo.ufn_GetSubtreeSalary
(
@mgrid AS int
)
RETURNS int
AS
BEGIN
RETURN (SELECT Salary
FROM Employees WHERE empid = @mgrid) +
CASE
WHEN EXISTS(SELECT * FROM Employees WHERE mgrid = @mgrid) THEN
(SELECT SUM(dbo.ufn_GetSubtreeSalary(empid))
FROM Employees
WHERE mgrid = @mgrid)
ELSE 0
END
END
注意dbo.ufn_GetSubtreeSalary函数非常简短;固然我们面对的任务很复杂,但函数只包含一个RETURN语句.dbo.ufn_GetSubtreeSalary函数查询指定管理员的薪水,再加上每一个管理员直接部属所包含子树的薪水总和.目前,试着用这个新的函数计算从Janet(empid是3)开始的子树的薪水总额,答案将是20000:
SELECT dbo.ufn_GetSubtreeSalary(3)
用近似的办法可以计算子树的深度,如Listing 5所示.dbo.ufn_GetSubtreeDepth函数也返回一个CASE表达式的后果,但二者的代码有所差别.
LISTING 5:计算子树的深度
CREATE FUNCTION dbo.ufn_GetSubtreeDepth
(
@mgrid AS int
)
RETURNS int
AS
BEGIN
RETURN CASE
WHEN EXISTS(SELECT * FROM Employees WHERE mgrid = @mgrid)
THEN 1 + (SELECT MAX(dbo.ufn_GetSubtreeDepth(empid))
FROM Employees
WHERE mgrid = @mgrid)
WHEN EXISTS(SELECT * FROM Employees WHERE empid = @mgrid)
THEN 1
ELSE NULL
END
END
CASE表达式先查抄指定的管理员能否有部属.假若有部属,函数返回1加上该管理员直接部属子树的最大深度——因此,这里呈现了递归;假如指定的管理员没有部属,CASE表达式肯定该管理员能否存在.如存在,则函数返回1(关于没有部属的管理员,他的深度是1);假如该管理员不存在,则CASE表达式返回NULL.目前,试验一下这个函数,供应Nancy的雇员ID(Nancy是最高级别的老板),计算整棵树的深度.计算后果将是5,它表明整个组织构造分5层.
SELECT dbo.ufn_GetSubtreeDepth(1) 以上是“UDF在层次型数据处理中的妙用之三[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论