sqlite - 按深度和兄弟顺序对记录进行排序

标签 sqlite sql-order-by common-table-expression singly-linked-list recursive-query

我有一个想要订购的树结构。垂直和水平。

从 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

在该请求中,排序仅在级别上。因此 sibling (Bob & Cindy、Dave & Emma、Fred & Gail)的顺序不受限制(即插入顺序)。

但我还需要订购 sibling 。所以我考虑使用下一个同级的 id 的同级列(就像在链接列表中一样)。

表格将是表格组织(名称文本,老板姓名, sibling 姓名)

数据:

'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

如何将其集成到递归请求中?

最佳答案

要将兄弟规范转换为可用于 ORDER BY 的格式,请使用另一个递归 CTE 来计算同一老板下的 sibling 。因为没有任何东西可以识别第一个同级,所以向后搜索更容易:

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 ...

关于sqlite - 按深度和兄弟顺序对记录进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50307938/

相关文章:

postgresql - 如何按属性分组并按日期排序

sql - 使用 SQL Server 递归公用表表达式获取文件夹中所有文件的完整路径(带子文件夹)

java - 无法打开数据库,因为数据库不存在

python-sqlite3.OperationalError : near "<": syntax error

android - 我可以将 Room Persistence 用于不同类型的数据库吗?

SQLite 错误 : cannot commit transaction - SQL statements in progress using Java Code

Sqlite 联合和排序顺序

SQL Server - 不按子句进行分页

sql - 递归 CTE 查询循环直到满足条件

java - 找不到使用 jOOQ 在 CommonTableExpression 中选择数据的正确方法