数据库 - 编写复杂的查询?

时间:2011-10-13 17:45:39

标签: database sql

我有一个表在树视图中包含我的节点数据。 每个节点都有自己的孩子。是否可以编写一个语句来获取每个节点及其子节点(每个级别按日期排序),并且它们的子节点可以存在多少级别?

- 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

1 个答案:

答案 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