SQL ORDER BY next
Подскажите пожалуйста как отсортировать в 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, найти эту запись и отобразить после имеющейся. Ведь это поле может меняться, поэтому сортировка по возрастанию не подойдёт и прочие хитрости.
Пока даже нет идей как это сделать изящно. Кроме циклов и временных таблиц.
Ответы (1 шт):
Автор решения: Gleb
→ Ссылка
Ответил уважаемый 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;