Рекурсивный иерархический запрос PG SQL с uuid зацикливается - PullRequest
0 голосов
/ 23 апреля 2020

Помогите там

Я бы хотел получить иерархические данные parent / childs. Это означает, что если я выберу идентификатор родителя, все его дети будут в записи. Их отношения определяются родительским UUID

. У меня есть в БД следующие данные:

INSERT INTO dummy_table (Id, parent) VALUES ('0171a28a-578a-49b5-86d5-ff0df54c8e96', '0171a28a-578a-49b5-86d5-ff0df54c8e96')
INSERT INTO dummy_table (Id, parent) VALUES ('0171a28a-5809-4708-9fc9-aeb91c16e560', '0171a28a-578a-49b5-86d5-ff0df54c8e96')
INSERT INTO dummy_table (Id, parent) VALUES ('0171a28a-580b-4de9-b3fa-35f13df27dd5', '0171a28a-5809-4708-9fc9-aeb91c16e560')
INSERT INTO dummy_table (Id, parent) VALUES ('0171a28a-580c-4e6b-8d17-0cc18af24b25', '0171a28a-580b-4de9-b3fa-35f13df27dd5')
INSERT INTO dummy_table (Id, parent) VALUES ('0171a28a-580d-47ee-aa15-92c6727e657e', '0171a28a-580c-4e6b-8d17-0cc18af24b25')

И моя просьба заключается в следующем:

WITH RECURSIVE cte AS (
   SELECT id, parent FROM dummy_table WHERE id = '0171a28a-578a-49b5-86d5-ff0df54c8e96'
   UNION ALL
   SELECT dt.id, dt.parent FROM dummy_table dt INNER JOIN cte ON cte.parent = dt.id
)
SELECT * FROM cte;

У меня проблема в том, что она зацикливается, и я не могу понять, почему.

Любая помощь, пожалуйста?

Спасибо вам всем

1 Ответ

1 голос
/ 23 апреля 2020

Этот запрос входит в al oop, потому что первая строка в ваших данных ссылается на себя как на своего родителя, и поэтому рекурсия никогда не останавливается. Добавьте проверку, чтобы избежать самостоятельной ссылки, и у вас все будет в порядке

WITH RECURSIVE cte AS (
    SELECT id, parent FROM dummy_table WHERE id = '0171a28a-578a-49b5-86d5-ff0df54c8e96'
    UNION ALL
    SELECT dt.id, dt.parent FROM dummy_table dt INNER JOIN cte ON cte.parent = dt.id and cte.id <> dt.id
)
SELECT * FROM cte;

Другой вариант - установить родителя как ноль в строках, где родительский равен id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...