Скажем, у меня есть таблица базы данных teams
, в которой есть столбец упорядочивания position
, позиция может быть либо null
, если это последний результат, либо идентификатором следующего team
, который расположен на единицу выше, чем эта команда. Это приведет к созданию списка, который всегда строго отсортирован (если вы используете целые числа, вам нужно управлять всеми другими значениями позиций при вставке нового team
, т.е. увеличивать их все на единицу), и вставка становится менее сложной ...
Но получить эту таблицу в виде отсортированного запроса оказалось непросто, вот где я сейчас нахожусь:
WITH RECURSIVE teams AS (
SELECT *, 1 as depth FROM team
UNION
SELECT t.*, ts.depth + 1 as depth
FROM team t INNER JOIN teams ts ON ts.order = t.id
SELECT
id, order, depth
FROM
teams
;
Это дает мне что-то вроде:
id | order | depth
----+-------+-------
53 | 55 | 1
55 | 52 | 1
55 | 52 | 2
52 | 54 | 2
52 | 54 | 3
54 | | 3
54 | | 4
Какой вид отражает то, куда мне нужно добраться с точки зрения упорядочения (максимальная глубина представляет собой порядок, который я хочу ...), однако я не могу понять, как изменить запрос, чтобы получить что-то вроде:
id | order | depth
----+-------+-------
53 | 55 | 1
55 | 52 | 2
52 | 54 | 3
54 | | 4
Однако, похоже, я меняю запрос, который он жалуется мне на применение GROUP BY
как к id
, так и к depth
... Как мне добраться из того места, где я сейчас, туда, где я хочу быть?
Ваш рекурсивный запрос должен где-то начинаться (пока вы выбираете всю таблицу в первом подзапросе). Предлагаю начать с последней записи, в которой столбец order
равен нулю, и перейти к первой записи:
with recursive team(id, ord) as (values(53,55),(55,52),(52,54),(54,null)),
teams as (
select *, 1 as depth from team where ord is null -- select the last record here
union all
select t.*, ts.depth + 1 as depth
from team t join teams ts on ts.id = t.ord) -- note that the JOIN condition reversed comparing to the original query
select * from teams order by depth desc; -- finally reverse the order
┌────┬──────┬───────┐ │ id │ ord │ depth │ ├────┼──────┼───────┤ │ 53 │ 55 │ 4 │ │ 55 │ 52 │ 3 │ │ 52 │ 54 │ 2 │ │ 54 │ ░░░░ │ 1 │ └────┴──────┴───────┘
@VaoTsun Вот содержимое моего .psqlrc
: pastebin.com/9MEipXCz и как он выглядит: i2.imageban.ru/out/2018/05/02/… Надеюсь, это будет полезно.
Спасибо! Увы, мне нужна расширенная поддержка юникода или чего-то еще.
border 2
,linestyle unicode
иnull
дают что-то похожее, но все же с вертикальным|
вместо линии - как вы рисуете свою таблицу? .. Я знаю, что это не связано, но, пожалуйста - поделитесь