id parent_id

1 0

2 0

3 2

4 0

5 1

6 0

我需要一个返回父行(parent_id = 0)然后是子行

的查询

第一位父母

第一位父母的所有孩子

第二位父母

第二位父母的所有孩子

第三位父母

第四位父母

预期结果:按ID排序

id parent_id

1 0(第一位父母)

5 1(第一父母的所有孩子)

2 0秒的父母

3 2(所有第二父母的子女)

4 0第三位父母

6 0第四位父母

我可以使用所有孩子的父母联盟 但这给了我父母的第一个孩子。 我需要父母及其子女。

任何人都可以提供帮助吗?

有帮助吗?

解决方案

您将使用递归CTE:

WITH r AS 
 (SELECT id, 
    NULL AS parent_id, 
    CAST(right('000' + CAST(row_number() 
         OVER (table.id) AS varchar), 3) AS varchar(50))
  FROM table WHERE parent IS NULL

  UNION ALL

  SELECT table.id, table.parent_id, 
    CAST(r.ord + right('000' + CAST(row_number() 
         OVER (ORDER BY table.id) AS varchar), 3) AS varchar(50))
  FROM r JOIN table 
   ON table.parent = r.id)

 SELECT id 
 FROM r
 ORDER BY left(ord + '000000000000000000000000000000000', 36)

请注意,如果任何ID的值大于999,则此特定版本将中断,如果您的级别超过12,则会中断。如果您担心这一点,则需要调整各个地方的零数。

可能有更好的方法,但这个方法有效。

其他提示

以下是使用带order by子句的union的示例解决方案(虽然它不适用于深度嵌套)。

SELECT  p.id, 
        p.parent_id, 
        p.name,  
        p.id AS sequence
FROM topics AS p 
WHERE p.parent_id = 0
UNION 
SELECT  t.id, 
        t.parent_id, 
        t.name, 
        t.parent_id AS sequence
FROM topics AS t
WHERE t.parent_id <> 0
ORDER BY sequence, parent_id, name

据我所知,如果您存储的所有内容都是父ID,则无法使用单个SQL语句执行此操作。如果需要快速检索数据树,则必须考虑存储预订遍历。它听起来比听起来容易得多,这里有很好的描述: http://articles.sitepoint。 COM /条/分层数据的数据库

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top