2017-02-02 3 views
0

Я только что придумал упражнение, которое я не могу решить. В таблице, как показано выше:Найти, если член является потомком в таблице отношений родителя и ребенка

Father|child 
a  |b 
b  |c 
c  |d 
d  |e 

можно ли написать один запрос, который говорит, если «е» является потомком «а» и/или, если «а» является anchestor из «е» в sql или реляционной алгебре?

Я думаю, что нет, потому что мне придется присоединиться к первому запросу, который мог бы проверить отношение отца/ребенка к новому подзапросу для каждого «родительского» уровня, который я хочу исследовать.

+0

да, это возможно , вы можете сделать это с помощью рекурсивных запросов. –

+0

Примечание: правильный термин на английском языке - «Родитель-ребенок», а не «Отец-ребенок». – RBarryYoung

+0

Посмотрите на рекурсивные запросы, как сказал @vkp (в некоторых версиях реляционной алгебры был также рекурсивный оператор). Для postgresql: https://www.postgresql.org/docs/8.4/static/queries-with.html – okaram

ответ

2

Учитывая

CREATE TABLE FamilyRelation (
    parent int, 
    child int, 
    primary key(parent,child) 
); 

вы можете сделать (в PostgreSQL, это стандарт SQL-99, но ... :)

WITH Recursive Descendants(Parent,Child) AS 
(
    SELECT Parent, Child 
    FROM FamilyRelation 
    UNION ALL 
    SELECT P.Parent, C.Child 
    FROM FamilyRelation C JOIN Descendants P ON (P.Child=C.Parent) 
) 
SELECT * from Descendants 
Order by Parent, child 

скрипку: http://sqlfiddle.com/#!15/f0e4d/6

Смежные вопросы