2012-07-30 62 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