我仍然不清楚你怎么知道哪个是 GROUP B,我想这是它的父级为空的记录。
create table org(groupid char(1), parentid char(1), details varchar(20));
insert into org values
('a', null, 'nope'),('b', 'a', 'I need this'),('c', 'b', 'nope'),('d', 'c', 'nope'),('e', 'd', 'nope');
create table trans(id int, groupid char(1));
insert into trans values
(1, 'b'),(2, 'c'),(3, 'c'),(4, 'd'),(5, 'e');
GO
10 行受影响
with all_levels as
(
select ob.groupid groupid_b, oc.groupid groupid_c,
od.groupid groupid_d, oe.groupid groupid_e,
ob.details
from org ob
inner join org oc
on oc.parentid = ob.groupid
inner join org od
on od.parentid = oc.groupid
inner join org oe
on oe.parentid = od.groupid
where ob.parentid is not null
) select * from all_levels;
GO
groupid_b | groupid_c | groupid_d | groupid_e |细节
:-------- | :-------- | :-------- | :-------- | :----------
乙 | c | d |电子|我需要这个
--= build a 4 levels row
with all_levels as
(
select ob.groupid groupid_b, oc.groupid groupid_c,
od.groupid groupid_d, oe.groupid groupid_e,
ob.details
from org ob
inner join org oc
on oc.parentid = ob.groupid
inner join org od
on od.parentid = oc.groupid
inner join org oe
on oe.parentid = od.groupid
where ob.parentid is not null
)
--= no matter what groupid returns b group details
, only_b as
(
select groupid_b as groupid, groupid_b, details from all_levels
union all
select groupid_c as groupid, groupid_b, details from all_levels
union all
select groupid_d as groupid, groupid_b, details from all_levels
union all
select groupid_e as groupid, groupid_b, details from all_levels
)
--= join with transactions table
select id, t.groupid, groupid_b, ob.details
from trans t
inner join only_b ob
on ob.groupid = t.groupid;
GO
编号 |组ID | groupid_b |细节
-: | :-------- | :-------- | :----------
1 |乙 |乙 |我需要这个
2 | c |乙 |我需要这个
3 | c |乙 |我需要这个
4 | d |乙 |我需要这个
5 |电子|乙 |我需要这个
dbfiddle here
您也可以处理递归函数,但我认为它在性能方面不会更好。
create function findDetails(@groupid char(1))
returns varchar(100)
as
begin
declare @parentid char(1) = '1';
declare @next_parentid char(1) = '1';
declare @details varchar(100) = '';
while @next_parentid is not null
begin
select @details = org.details, @parentid = org.parentid, @next_parentid = op.parentid
from org
inner join org op
on op.groupid = org.parentid
where org.groupid = @groupid
set @groupid = @parentid;
end
return @details;
end
GO
✓
select id, groupid, dbo.findDetails(groupid) as details_b
from trans;
GO
编号 |组ID |细节_b
-: | :-------- | :----------
1 |乙 |我需要这个
2 | c |我需要这个
3 | c |我需要这个
4 | d |我需要这个
5 |电子|我需要这个
dbfiddle here