首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql问题:先获取父行,再获取子行

问Sql问题:先获取父行,再获取子行
EN

Stack Overflow用户
提问于 2009-10-22 09:20:01
回答 3查看 4.1K关注 0票数 1

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第四个父级

我可以使用父母联盟,然后是所有孩子,但这会让我先有父母,然后是孩子。我需要父级和它的子级。

有人能帮上忙吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-20 21:20:10

为此,您将使用递归CTE:

代码语言:javascript
复制
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个级别,它将中断。如果这是您关心的问题,您需要调整各个位置的零的数量。

也许还有更好的方法,但这一种方法有效。

票数 0
EN

Stack Overflow用户

发布于 2010-02-20 20:03:26

下面是一个使用带有order by子句的联合的示例解决方案(尽管它不适用于深度嵌套)。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2009-10-22 09:43:58

据我所知,如果您存储的都是父id,则不能使用单个SQL语句完成此操作。如果您需要快速检索数据树,则必须考虑存储预排序遍历。它比听起来更简单,这里描述得很好:http://articles.sitepoint.com/article/hierarchical-data-database

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1604537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档