Заказ запроса WITH RECURSIVE в Postgres - PullRequest
4 голосов
/ 12 июля 2010

Я выполняю рекурсивный запрос в Postgres для получения списка электронных писем и их дочерних элементов следующим образом:

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, чтобы список получался в древовидном порядке, и Postgres не позволит мне вставить предложение ORDER BY перед UNION ALL.

Спасибо,

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

Это не проверено, но обычно я могу добавить любой 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;
2 голосов
/ 12 июля 2010

Создание представления, состоящего из первой части вашего запроса, упорядоченной по заголовку.Может быть, что-то вроде этого?

      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;

Затем объедините все это представление с другим запросом, как вы делали раньше.Я думаю, что это сработает.На моем нетбуке прямо сейчас, поэтому я не могу проверить: /

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