2012-07-30 60 views
4

在表迭代有列ID,標題和PARENTID。PARENTID用於在同一個表項的ID是考慮它的父 - 因此ParentID爲NULL的任何條目是其本身是父親的一個條目如何通過SQL表,「父母」和孩子」行是在同一個表

我需要一個查詢,它將遍歷每個父級並列出其下的任何子級(理想情況下用連字符或其他表示它的從屬)任何人都知道如何做到這一點或如何指向正確的方向嗎?

(我已經研究過T-SQL並閱讀了許多類似的在線問題,但是我的SQL不夠銳利感覺它,所以我會非常ppreciate一些指針!)

+0

- 這是一個CONNECT BY - 也許,讓SQL服務器的線索..不知道 – Randy 2012-07-30 11:38:32

+0

如果你真的想通過一個表進行迭代,編寫一個查詢,並用光標閱讀。但我想,你想有一個查詢返回一個行與其子行。我對嗎? – DHN 2012-07-30 11:38:47

+1

http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx CTE /遞歸查詢。 – xQbert 2012-07-30 11:46:43

回答

2

在這裏,你是語法使用!

WITH n(ID, Title) AS 
        (SELECT ID, Title 
        FROM YourTable 
        WHERE ID = (SELECT TOP 1 ID FROM YourTable WHERE ParentID IS NULL) 
        UNION ALL 
        SELECT nplus1.ID, nplus1.Title 
        FROM YourTable as nplus1, n 
        WHERE n.ID = nplus1.ParentID) 
        SELECT ID, Title FROM n 
在Oracle
1

從自引用表得到各層數據,你可以在SQL 2008

WITH n(ID) AS 
    (SELECT ID FROM YourTable 
    UNION ALL 
    SELECT nplus1.ID 
    FROM YourTable as nplus1, n 
    WHERE n.ID = nplus1.ParentID) 
    SELECT ID FROM n 
+0

謝謝,這似乎工作!儘管我沒有解釋清楚:理想情況下,它應該列出第一個父母的標題(其中ParentID爲空),然後列出該父母的子女的標題(例如理想地用連字符作爲前綴) – 2012-07-30 11:50:39