按深度和兄弟顺序排序记录
order records by depth AND sibling order
我有一个树结构要订购。垂直和水平。
从 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
在该请求中,排序仅在级别上。所以兄弟姐妹(Bob & Cindy、Dave & Emma、Fred & Gail)的顺序不受限制(即插入顺序)。
不过我也需要给兄弟姐妹点单。所以我考虑了一个带有下一个兄弟 ID 的兄弟列(就像在链表中一样)。
table 将是 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
如何将其集成到递归请求中?
要将兄弟规范转换为可用于 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 ...
我有一个树结构要订购。垂直和水平。
从 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
在该请求中,排序仅在级别上。所以兄弟姐妹(Bob & Cindy、Dave & Emma、Fred & Gail)的顺序不受限制(即插入顺序)。
不过我也需要给兄弟姐妹点单。所以我考虑了一个带有下一个兄弟 ID 的兄弟列(就像在链表中一样)。
table 将是 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
如何将其集成到递归请求中?
要将兄弟规范转换为可用于 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 ...