【发布时间】:2021-03-11 00:03:58
【问题描述】:
我正在尝试从两个表中选择单个父记录的每个可能的子记录。
表一包含当前所有者和父所有者的所有帐户 表二是保存父母和孩子之间关系的表。 到目前为止,我已经设法选择了主要的父母。
我想不通的是如何与子孙相处
以表结构为例:
表帐户:
accountId | name | last name | email | OwningBusiness
表关系:
BusinessUnit | unitname | ParentBusinessUnit
OwningBusiness <=> BusinessUnitId
OwningBusiness <=> parentGroupOwner
我的主要目标是选择以根为基础父级的整个树。 如何制定一个查询,从父组中获取所有帐户,然后检查谁是孩子,从孩子中选择所有帐户,并继续这样做,直到检查完所有可能的孩子/孙子?
编辑: 搜索应基于给定的 ParentBusinessUnit,并且应仅返回包含帐户表中所有列的帐户记录 示例数据:
OwningBusinessUnit ParentBusinessUnit
7C6A387E-4231 113D3FDB-7B8E
A871C1DB-9B49 7C6A387E-4231
99E668AC-E183 113D3FDB-7B8E
61E240E0-5FDB 964467C5-5EDB
DF12F932-60DB 964467C5-5EDB
1A836362-883E CB52AEC3-9EA2
CDBF825B-51D6 113D3FDB-7B8E
C7839193-51D6 CDBF825B-51D6
F8831375-51D6 CDBF825B-51D6
BEA96E00-7675 113D3FDB-7B8E
556A4549-7675 BEA96E00-7675
E4FD4238-A4F0 E178822F-AF63
6CFE118A-62B0 113D3FDB-7B8E
通过使用以下查询,我已创建交集以提供上述数据
select a.OwningBusinessUnit, bu.ParentBusinessUnit from Accounts a
inner join Relations bu on a.OwningBusinessUnit = bu.BusinessUnitId
group by bu.ParentBusinessUnit, a.OwningBusinessUnit
请求的结果: 提供 ParentBusinessUnit "113D3FDB-7B8E" 作为参数应该可以找到所有 帐户:“113D3FDB-7B8E”、“7C6A387E-4231”、“99E668AC-E183”、“CDBF825B-51D6”、“A871C1DB-9B49”等
编辑 2: 根据答案,我做了以下更改:
declare @root nvarchar(50) = '113D3FDB-7B8E';
with rcte as
(
select
br.Name buName,
br.BusinessUnit,
br.ParentBusinessUnit,
a.*
from BusinessUnitBase br
join AccountBase a on a.OwningBusinessUnit = br.BusinessUnit
where br.ParentBusinessUnit = @root and br.IsDisabled = 0
union all
select
r.*
from rcte r
join BusinessUnitBase br on br.ParentBusinessUnit = br.BusinessUnit
)
select
r.*
from rcte r
order by r.buName
发生的情况是返回的帐户仅适用于没有孙子的第一个孩子
【问题讨论】:
-
请展示一些示例数据和您的预期输出
-
两张表如何连接?
-
2 个表已连接,稍后将添加一些示例数据
标签: sql sql-server database