项目中遇到了查询所有子部门,更确切的说是后代部门。通过parentid这个关系来查询。之前自己想到的办法是使用递归函数来查询。但是性能很差,而且结果中有重复现象,目前没有找到结果重复的原因。由于该函数在做深层次查询性能太差,所以到网上搜索解决方案。最后发现了一种CTE递归查询的方法,老实说,一开始并没有搞懂是如何实现了递归的功能的。后来查了一下msdn:公用表表达式可以包括对自身的引用。
with temp(departmentId,ParentId)
as(
select departmentId,ParentId from Departments
where departmentid=1
union all
select d.departmentId,d.ParentId
from Departments d inner join temp t on d.parentid=t.Departmentid
)
select DepartmentID from temp
这样一个查询我们看到在union all 后面的查询是让department和CTE temp做inner join 而本身CTE他来源于基本查询 ,在这里用于生成CTE temp的查询引用了自身,从而实现了递归查询,这种查询性能简直是之前自己写的那个递归函数根本无法比的。