如何迭代遍历一个SQL表格,其中“父”行和“子”行在同一张表格中。

5
在一个表格中,有ID、Title和ParentID这三个列。ParentID用于表示在同一张表格中的入口的ID,它是其父级的ID——因此,任何ParentID为空的记录都是父级自己。
我需要一条查询语句,可以遍历每个父级,并列出其下面的任何子级(最好用连字符或其他符号表示其从属)。请问有人知道如何实现这个功能或者能指点我正确的方向吗?
(我已经调查了T-SQL并阅读了许多类似的在线问题,但我的SQL水平还不够扎实,无法理解它,所以我非常感激任何指引!)

在Oracle中,这是一个CONNECT BY - 也许这会给SQL Server一些线索...不确定。 - Randy
如果您真的想要遍历一个表格,可以编写一个查询并使用游标进行读取。但我猜想,您想要一个返回行及其子行的查询结果。我猜对了吗? - DHN
2
CTE/递归查询。 - xQbert
2个回答

3

这是您需要的内容!

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

1

如果要从自引用表中获取层次结构数据,可以在SQL 2008中使用WITH语法。

  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

谢谢,看起来可以工作!不过我没有解释清楚:理想情况下,它应该列出第一个父级的标题(其中ParentID为null),然后列出该父级的子项标题(最好以连字符为前缀,例如)。 - Rich Jenks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接