SQL Server 如何在SQL中查找View的祖父父子关系

ego6inou  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(257)

有一个如下所示的表:
| 父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)
nqwrtyyt

nqwrtyyt1#

除非万不得已,我一般不会使用递归,通常是由于未知或大量的层次,我会简单地使用左连接和case语句来获得父节点和祖节点,并使用子节点选择来获得子节点计数。

SELECT A.Agencyid, A.CompanyName
, CASE WHEN p.AgencyId is not null then p.AgencyId 
       else A.AgencyID END AS ParentAgencyId
, CASE WHEN p.AgencyId is not null then p.CompanyName
       else A.CompanyNameEND ParentCompanyName
, CASE WHEN gp.AgencyId is not null then gp.AgencyId 
       WHEN p.AgencyId is not null then p.AgencyId 
       else A.AgencyID END GrandParentAgencyId
, CASE WHEN gp.AgencyId is not null then gp.CompanyName
       WHEN p.AgencyId is not null then p.CompanyName
       else A.CompanyNameEND GrandParentCompanyName
, (SELECT count(*) FROM Agency where ParentId = A.AgencyId) Children
, (SELECT count(*) FROM Agency C 
       JOIN Agency GC ON C.AgencyId = GC.ParentId 
       where C.ParentId = A.AgencyId) GrandChildren
FROM Agency A
LEFT JOIN Agency P ON P.AgencyId = A.ParentId
LEFT JOIN Agency GP ON GP.AgencyId = P.ParentId
WHERE A.AgencyId = 1

相关问题