Как получить самый верхний родительский в PostgreSQL - PullRequest
7 голосов
/ 18 мая 2010

У меня есть таблица древовидной структуры со столбцами: идентификатор, родитель, имя. Дано дерево A-> B-> C, Как я могу получить самый верхний родительский ID в соответствии с идентификатором C? Особенно, как написать SQL с "с рекурсивным"? Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 мая 2010

Для реализации рекурсивных запросов требуется Общее табличное выражение (CTE). Этот запрос вычисляет предков всех родительских узлов. Поскольку нам нужен только верхний уровень, мы выбираем, где уровень = 0.

WITH RECURSIVE Ancestors AS
(
   SELECT id, parent, 0 AS level FROM YourTable WHERE parent IS NULL
   UNION ALL
   SELECT child.id, child.parent, level+1 FROM YourTable child INNER JOIN
      Ancestors p ON p.id=child.parent

)
SELECT * FROM Ancestors WHERE a.level=0 AND a.id=C

Если вы хотите получить все ваши данные, используйте внутреннее соединение с идентификатором, например,

SELECT YourTable.* FROM Ancestors a WHERE a.level=0 AND a.id=C
   INNER JOIN YourTable ON YourTable.id = a.id
3 голосов
/ 18 мая 2010
WITH    RECURSIVE q AS
        (
        SELECT  m
        FROM    mytable m
        WHERE   id = 'C'
        UNION ALL
        SELECT  m
        FROM    q
        JOIN    mytable m
        ON      m.id = q.parent
        )
SELECT  (m).*
FROM    q
WHERE   (m).parent IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...