2011-10-13 78 views
0

我有一個包含我的節點數據在樹視圖中的表。 每個節點都有自己的孩子。是否可以編寫單個語句來獲取每個節點以及它的子節點(每個節點按日期排序)以及它們的子節點是否存在多個級別?數據庫 - 寫一個複雜的查詢?

- A 
- B 
-  F 
-   L 
-  G 
- C 
-  K 
- D 
-  H 
-  I 
-  J 
- E 

所以SQL應該返回 每個節點都有一個parentId的,當parentId的爲空則表示該節點是一個頂級節點

- 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 
+3

表格的具體結構是什麼?你有什麼嘗試?你使用的是什麼RDBMS,以及哪個版本? – 2011-10-13 17:47:54

+0

什麼數據庫產品和版本? – Thomas

+0

爲我提供任何數據庫和任何你想要的版本的解決方案。我不想最終答案,我想要一個解決方案。 (我使用sqlite3的情況下,它有任何區別) – aryaxt

回答

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 

(這裏唯一的非標準構造是具有高DBMS特定性的lpad功能)。

但我認爲你不能將任何解決方案「轉換」爲SQlite