Я выполняю рекурсивный запрос в Пост-ГРЭС для получения списка электронных писем и их потоковых детей следующим образом:
WITH RECURSIVE cte (id, title, path, parent_id, depth) AS (
SELECT id,
title,
array[id] AS path,
parent_id,
1 AS depth
FROM emails
WHERE parent_id IS NULL
UNION ALL
SELECT emails.id,
emails.title,
cte.path || emails.id,
emails.parent_id,
cte.depth + 1 AS depth
FROM emails
JOIN cte ON emails.parent_id = cte.id
)
SELECT id, title, path, parent_id, depth FROM cte
ORDER BY path;
Как пошел бы об изменении порядка списка (например, сортирующий на заголовке) прежде, чем найти дочерние электронные письма. Я, очевидно, должен сохранить внешний ORDER BY так, чтобы список был получен в, он - древовидный порядок, и Пост-ГРЭС не позволит мне вставить пункт ORDER BY перед ОБЪЕДИНЕНИЕМ ВСЕ.
Спасибо,
Это не тестировалось, но обычно я могу добавить любой ORDER BY перед объединением, если есть круглые скобки ...
WITH RECURSIVE cte (id, title, path, parent_id, depth) AS (
( SELECT id,
title,
array[id] AS path,
parent_id,
1 AS depth
FROM emails
WHERE parent_id IS NULL
ORDER BY title
)
UNION ALL
SELECT emails.id,
emails.title,
cte.path || emails.id,
emails.parent_id,
cte.depth + 1 AS depth
FROM emails
JOIN cte ON emails.parent_id = cte.id
)
SELECT id, title, path, parent_id, depth FROM cte
ORDER BY path;
Создайте представление, состоящее из первой части вашего запроса, упорядоченное по названию. Может быть, что-то вроде этого?
CREATE VIEW title_Sort AS
SELECT id,
title,
array[id] AS path,
parent_id,
1 AS depth
FROM emails
WHERE parent_id IS NULL
ORDER BY title;
Затем объедините это представление с другим запросом, как вы делали раньше. Думаю, это сработает. Я сейчас на своем нетбуке, поэтому не могу проверить :/