【发布时间】:2019-12-04 04:08:36
【问题描述】:
您如何不仅返回所有人和祖先,而且返回所有只有他们最近的祖先恰好被加载的人?
我之前写过一堆递归查询,但这个让我感到困惑和着迷。插图显示了层次结构。
我保证这不是作业问题:)。
这是测试数据:
create table test_people (
id_person int unique not null
,ancestor_id_person int
,name varchar(10) unique not null
,wealth varchar(4) not null
);
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(1, null, 'Abby', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(2, 1, 'Barry', 'rich');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(3, 1, 'Dan', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(4, 1, 'Elaine', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(5, 1, 'Frank', 'rich');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(6, 1, 'Gary', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(7, 2, 'Hank', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(8, 3, 'Irene', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(9, 4, 'Jack', 'rich');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(10, 5, 'Kelly', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(11, 5, 'Nancy', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(12, 6, 'Larry', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(13, 6, 'Mike', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(14, 7, 'Pearl', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(15, 7, 'Rick', 'poor');
insert into test_people (id_person, ancestor_id_person, name, wealth) values
(16, 9, 'Steve', 'rich');
这是我想要的输出:
NAME, NEAREST_WEALTHY_ANCESTOR
Abby, null
Barry, Barry
Dan, null
Elane, null
Frank, Frank
Gary, null
Hank, Barry
Irene, null
Jack, Jack
Kelly, Frank
Nancy, Frank
Larry, null
Mike, null
Pearl, Barry
Rick, Barry
Steve, Steve
这是我最新的(完全错误的)尝试:
with ancestors as (
select 1 as level, id_person, ancestor_id_person, name, wealth
from test_people
where id_person = 1
UNION ALL
select parent.level + 1, child.id_person, child.ancestor_id_person, child.name, child.wealth
from ancestors as parent,
test_people as child
where parent.id_person = child.ancestor_id_person
)
select T.id_person, A.ancestor_id_person, A.name, T.name, T.ancestor_id_person
from test_people as T
left outer join ancestors as A on T.ancestor_id_person = max(A.ancestor_id_person, A.id_person)
【问题讨论】: