मुझे लगता है कि आपको अपने बच्चे_आईडी का नाम बदलकर नोड करना चाहिए, अपने माता-पिता का नाम बदलकर चाइल्ड_ऑफ करना चाहिए। आपके कॉलम का नामकरण थोड़ा भ्रमित करने वाला है
create table stack_overflow
(
node int, child_of int
);
insert into stack_overflow(node, child_of) values
(1,0),
(2,1),
(3,2),
(4,2),
(5,3),
(6,4),
(7,0),
(8,7),
(9,8),
(10,1);
यह किसी भी सीटीई-सक्षम आरडीबीएमएस पर काम करता है :
with find_parent(parent, child_of, recentness) as
(
select node, child_of, 0
from stack_overflow
where node = 9
union all
select i.node, i.child_of, fp.recentness + 1
from stack_overflow i
join find_parent fp on i.node = fp.child_of
)
select top 1 parent from find_parent
order by recentness desc
आउटपुट:
parent
7
[संपादित करें:अधिक लचीला और भविष्य-सबूत] :
with find_parent(node_group, parent, child_of, recentness) as
(
select node, node, child_of, 0
from stack_overflow
where node in (5,9)
union all
select fp.node_group, i.node, i.child_of, fp.recentness + 1
from stack_overflow i
join find_parent fp on i.node = fp.child_of
)
select q.node_group as to_find, parent as found
from find_parent q
join
(
select node_group, max(recentness) as answer
from find_parent
group by node_group
) as ans on q.node_group = ans.node_group and q.recentness = ans.answer
order by to_find
आउटपुट:
to_find found
5 1
9 7
यदि आप पोस्टग्रेज . का उपयोग कर रहे हैं , उपरोक्त कोड को छोटा किया जा सकता है:
with recursive find_parent(node_group, parent, child_of, recentness) as
(
select node, node, child_of, 0
from stack_overflow
where node in (5,9)
union all
select fp.node_group, i.node, i.child_of, fp.recentness + 1
from stack_overflow i
join find_parent fp on i.node = fp.child_of
)
select distinct on (node_group) node_group as to_find, parent as found
from find_parent
order by to_find, recentness desc
चट्टानों पर अलग! :-)