关于树形结构数据的见解

现在数据库中有一些逻辑上是树形结构的列表数据,如下:
name id parent_id


A 1
B 2 1
D 4 2
E 5 3
G 7 4
C 3 1
F 6 4

他们不是按照树的标准结构排序的。
现在我们讨论一下对这个列表的常见查询操作有哪些?
理解了这些,我们对以后遇到的树形结构的查询就会应对自如。让我们开始吧

首先
我们有一下共识:
1、记录之间是通过id和parent_id相互关联的,在这个基础上才有我们的逻辑树形结构,我们一直都会用到id和parend_id的概念。
2、数据库中处理的语句是start with … connect by id = parent_id 。
3、要通过递归才能实现遍历所有树的所有节点
然后
基于数据库语句只有这个,而这个语句有两个关键的变量,
变量1:从哪里开始遍历,取值有(id=某一个值开始遍历、parent_id=某一个值开始遍历)
变量2:遍历的方向,取值有(遍历子节点、遍历父节点),prior 决定遍历方向,放在id的一边就是遍历子节点prior id;放在parent_id的一边就是遍历父节点prior parent_id。

以上两个变量排列组合就有4中可能,但是不要怕,我们只要分两步走即可
第一步:从哪些节点开始遍历
第二步:遍历这些节点的子节点还是父节点

例1:遍历ID=2的这些节点的所有子节点
第一步:哪个节点的节点ID =2,(start with id=
第二步:找出这些节点的子节点第一步:(prior id
select * from t
start with t.id= ‘2’
connect by prior id= parent_id;

例2:遍历ID=2的这些节点的所有父节点
第一步:哪些节点的节点ID=2,(**start with id = **)
第二步:找出这些节点的父节点,(prior parent_id
select * from t
start with t.y = ‘2’
connect by y = prior z;

例3:遍历parent_id=null的这些节点的所有子节点
第一步:哪些节点的parent_id是null的
第二步:找出这些节点的子节点,(start with parent_id =
select * from t --找A的子节点,(prior id
start with t.z is null
connect by prior y = z;

例4:遍历parent_id=4的这些节点的所有父节点
第一步:哪些节点的parent_id是4,(start with parent_id =
第二步:找出这些节点的父节点,(prior parent_id
select * from t
start with t.z = ‘4’
connect by y = prior z;

总结:
1、4种情况的来源,及其处理
2、connect by是先序遍历的,兄弟节点直接是排序的。
先序遍历就是排序的!!
3、如果结果与你预期不一致,注意下你定义的id,parent_Id的类型,int类型和varchar类型排序会不一样。相同长度的int和varchar排序时一致的,这个可以处理。
4、不管怎么样,使用connect by是会排序的,排序的额
5、树形结构中的排序推荐是用order siblings by xxx,不推荐使用order by,因为order by可能会破坏结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire Fish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值