CREATE FUNCTIONdbo.GetTotalSalary(@manager_idAS char( 5))RETURNS intAS BEGIN RETURN( SELECT [工资]FROM[员工信息] WHERE[员工号码]=@manager_id)+ CASE WHENEXISTS(SELECT*FROM [员工信息]WHERE[上级号码] =@manager_id) THEN( SELECTSUM(dbo.GetTotalSalary( [员工号码]))FROM[员工信息] WHERE [上级号码]= @manager_id ) ELSE 0 END END
--员工逍遥及其下属的工资总额 SELECT dbo.GetTotalSalary('E9906') AS 工资总额 3. 某棵子树的结点信息,如:员工郑可可及其所有下属员工的信息 a.求树的深度:
CREATEFUNCTION dbo.GetUnderlyingLevel(@manager_idAS char( 5)) RETURNS intAS BEGIN RETURN CASE WHENEXISTS( SELECT*FROM[员工信息] WHERE[上级号码]=@manager_id) THEN1+(SELECT MAX(dbo.GetUnderlyingLevel( [员工号码]))FROM[员工信息] WHERE[上级号码]=@manager_id) ELSE1 END END
如:SELECT dbo.GetUnderlyingLevel('E9901') AS '下属级别' ---返回:4
b 求某一个节点所有的子节点的信息。 由于返回的是一个结果集,所以需要用table数据类型来存储
CREATEFUNCTION dbo.GetSubtreeInfo(@manager_idASchar (5 )) RETURNS@treeinfotable ([员工号码 ][char] (5 )NOTNULL, [姓名 ][char] (10 )NOTNULL, [年龄 ][int]NOTNULL, [工资 ][money]NOTNULL, [上级号码 ][char] (5 )NULL, [级别 ][int]NOTNULL )AS BEGIN DECLARE@levelAS int SELECT@level= 0 INSERT INTO@treeinfo SELECT [员工号码],[ 姓名],[年龄 ],[工资] ,[上级号码],@level FROM [员工信息] WHERE [员工号码]= @manager_id WHILE@@ROWCOUNT> 0 BEGIN SET@level=@level + 1 INSERT INTO@treeinfo SELECTE. [员工号码],E.[ 姓名],E.[年龄 ],E.[工资] ,E.[上级号码],@level FROM [员工信息]AS EJOIN@treeinfoAST ONE. [上级号码]= T.[员工号码] ANDT.[级别]=@level- 1 END RETURN END
--如:查询郑可可及其下属的信息 SELECT * FROM dbo.GetSubtreeInfo('E9903') --结果: c .对b进行改进,将该树型结构以图形化的方式打印出来。 由于打印要进行排序,所以加了一个标记字段。