упорядочить записи по глубине и порядку - PullRequest
0 голосов
/ 12 мая 2018

У меня есть древовидная структура, которую я хочу заказать. Вертикально и горизонтально.

Из документа SQLite я получил порядок по глубине:

WITH RECURSIVE
  under_alice(name,level) AS (
    VALUES('Alice',0)
    UNION ALL
    SELECT org.name, under_alice.level+1
      FROM org JOIN under_alice ON org.boss=under_alice.name
     ORDER BY 2 DESC
  )
SELECT substr('..........',1,level*3) || name FROM under_alice;

Что дает:

Alice
...Bob
......Dave
......Emma
...Cindy
......Fred
......Gail

В этом запросе порядок только на уровне. Таким образом, порядок братьев и сестер (Боб и Синди, Дейв и Эмма, Фред и Гейл) не ограничен (т.е. это порядок вставки).

Но мне также нужно заказать братьев и сестер. Поэтому я думаю о столбце с одним и тем же именем с идентификатором следующего (как в связанном списке).

Таблица будет table org (name text, boss name, sibling name)

Данные:

'Alice', null, null
'Cindy', 'Alice', 'Bob'
'Bob', 'Alice', null
'Dave', 'Bob', 'Emma'
'Emma', 'Bob', null
'Gail', 'Cindy', 'Fred'
'Fred', 'Cindy', null

И тогда результат будет:

Alice
...Cindy
......Gail
......Fred
...Bob
......Dave
......Emma

Как я могу интегрировать это в рекурсивный запрос?

1 Ответ

0 голосов
/ 12 мая 2018

Чтобы преобразовать спецификацию брата в формат, используемый для ORDER BY, используйте другой рекурсивный CTE для подсчета братьев и сестер под тем же боссом. Поскольку нет ничего, что идентифицирует первого брата, поиск легче в обратном направлении:

WITH RECURSIVE OrderedOrg(Name, Boss, SiblingOrder) AS (
  SELECT Name, Boss, 0
  FROM org
  WHERE Sibling IS NULL

  UNION ALL

  SELECT org.Name, org.Boss, OrderedOrg.SiblingOrder + 1
  FROM org
  JOIN OrderedOrg ON org.Boss    = OrderedOrg.Boss
                 AND org.Sibling = OrderedOrg.Name
),
under_alice(...) AS (
  ...
  SELECT ...
  FROM ... OrderedOrg ...
  ...
  ORDER BY level DESC, SiblingOrder DESC
)
SELECT ...
...