SQL ORDER BY next

Рейтинг: 0Ответов: 1Опубликовано: 03.06.2023

Подскажите пожалуйста как отсортировать в PostgreSQL(15+) такую таблицу:

id |  name  | next_id
1  | Test01 |  2
2  | Test02 |  3
3  | Test03 |  6
4  | Test04 |  5
5  | Test05 |  null
6  | Test06 |  4
7  | Test07 |  null

Требуется SQL-запрос, чтобы упорядочить по next_id столбцу — это указатель на следующую строку. Результат ожидаю такой:

id |  name  | next_id
1  | Test01 |  2
2  | Test02 |  3
3  | Test03 |  6
6  | Test06 |  4
4  | Test04 |  5
5  | Test05 |  null
7  | Test07 |  null

Необходимо считать у каждой записи поле next_id, найти эту запись и отобразить после имеющейся. Ведь это поле может меняться, поэтому сортировка по возрастанию не подойдёт и прочие хитрости.

Пока даже нет идей как это сделать изящно. Кроме циклов и временных таблиц.

Ответы

▲ 0Принят

Ответил уважаемый JohnH:

WITH RECURSIVE t(id, name, next_id) AS (SELECT * FROM table),
cte AS (
  SELECT t.id, t.name, t.next_id, t.id AS root_id, 1 AS depth
    FROM t
   WHERE NOT EXISTS (SELECT * FROM t t2 WHERE t.id = t2.next_id)
  UNION ALL
  SELECT t.id, t.name, t.next_id, cte.root_id, cte.depth + 1 AS depth
    FROM t
    JOIN cte ON (t.id = cte.next_id))
SELECT cte.id, cte.name, cte.next_id
  FROM cte
 ORDER BY cte.root_id, cte.depth, cte.id;