有一个如下所示的表:
| 父ID|代理ID|公司名称|
| - ------|- ------|- ------|
| 零|1个|ABC代理|
| 零|第二章|另一个机构|
| 第二章|三个|机构3|
| 三个|四个|机构4|
此处的目标是开发一个数据库视图,显示给定代理的父代和祖父母。有些代理只有父代(没有祖父母),还有一些代理是独立的,它们没有父代。我们希望视图如下所示:
- GrandParentAgencyNo
- GrandParentName
- ParentAgencyNo
- ParentName
- AgencyNo
- AgencyName
- NumberOfChildren
- NumberOfGrandChildren
我们可以使用它来查找给定机构的所有子对象:
select * from AgencyView where ParentAgencyNo = "ABC123"
如果代理没有母公司,则上述结果应如下所示:
- GrandParentAgencyNo: 1
- GrandParentName: ABC Agency
- ParentAgencyNo: 1
- ParentName: ABC Agency
- AgencyNo: 1
- AgencyName: ABC Agency
- NumberOfChildren: 0
- NumberOfGrandChildren: 0
我试着编写类似下面的递归函数(包括试图找到祖父的其他查询),但没有成功。我不熟悉递归,似乎总是达到SQL Server中的最大递归率。
with A(Id, ParentId) as
(
select AgencyId, ParentAgencyId from Agency
union all
select e.AgencyId, p.ParentId from Agency e
join A p on e.ParentAgencyId = p.Id
)
select * from A
OPTION (MAXRECURSION 32767)
1条答案
按热度按时间nqwrtyyt1#
除非万不得已,我一般不会使用递归,通常是由于未知或大量的层次,我会简单地使用左连接和case语句来获得父节点和祖节点,并使用子节点选择来获得子节点计数。