我有一个表在树视图中包含我的节点数据。 每个节点都有自己的孩子。是否可以编写一个语句来获取每个节点及其子节点(每个级别按日期排序),并且它们的子节点可以存在多少级别?
- A
- B
- F
- L
- G
- C
- K
- D
- H
- I
- J
- E
所以sql应该返回 每个节点都有一个parentId,当parentId为null时,表示该节点是顶级节点
- A
- B
- F
- L
- G
- C
- K
- D
- H
- I
- J
- E
修改 这是我的表结构,它位于sqlite文件中。 我真的不关心版本或RDBMS,只要我得到正确的解决方案我将自己转换为sqlite并且我会让它工作
Node Table
___________________
int - nodeId
int - parentId /*referes to nodeId of the parent*/
varchar - title
TimeStamp - dateCreate
答案 0 :(得分:3)
正如你所说,你不关心DBMS(即使你使用SQLite):
这是oracle解决方案:
SELECT lpad(' ',3*level)||title as title
FROM your_table
CONNECT BY PRIOR nodeId = parentId
START WITH parentId IS NULL
这是标准的ANSI SQL解决方案:
WITH RECURSIVE CatCTE (title, nodeId, parentId, lvl) as
(
SELECT title, nodeId, parentId, 1 as lvl
FROM your_table
WHERE parentId IS NULL
UNION ALL
SELECT c2.title, c2.nodeId, c2.parentId, CatCTE.lvl + 1
FROM your_table c2
INNER JOIN CatCTE ON CatCTE.nodeId = c2.parentId
)
SELECT lpad(' ',3*level)||title as title
FROM CatCTE
(其中唯一的非标准构造是lpad
函数,它具有高度DBMS特性。)
但我认为你不能将任何一种解决方案“转换”为SQlite