下一页 1 2
UDF在层次型数据处理中的妙用
三、计算合计数和子树深度
现在来看几个需要窍门才能解决的问题——如果不用递归就很难解决的问题。假定我们想要得到从指定管理员开始的特定子树下所有雇员的薪水总额。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函数查询指定管理员的薪水,再加上每一个管理员直接下属所包含子树的薪水总和。现在,试着用这个新的函数计算从J.net(empid是3)开始的子树的薪水总额,答案将是20000:
SELECT dbo.ufn_GetSubtreeSalary(3)