数据库处理二叉树的一个实例

这是帖子原文

感觉超难SQL问题 单表查询连接起点末点

表:
起点 末点
1      2
2      3
3      4
4      5 
a      b 
等等

想要查询出来的结构:
(1)起末点连接:
起点 末点 起点 末点 起点 末点 起点 末点
1       2       2      3      3       4       4      5
(2)除去以上连接的点以外还有独立的点:
起点 末点
a       b

可以用多条SQL查询,只要查询出来的结果拼凑起来没有重复即可,

点击打开链接


很显然,常规手段处理有难度,仔细分析问题  ,其实只是一棵二叉树,基于二叉树的处理方式,很容易实现,具体如下:

--设置测试数据
create table #abc(s varchar(10),e varchar(10),Path varchar(100))
go
insert into #abc(s,e)
select 1,2 union
select 2,3 union 
select 3,4 union
select 4,5 union
select 'a','b'

update #abc set [Path]=null
--设置根节点
update #abc
set Path=s+','+e+'->'
where s not in(select e from #abc)

while @@rowcount>0
begin
--循环处理儿子节点
  update #abc
  set Path=t2.Path+t1.s+','+t1.e+'->'
  from #abc t1
    join(select * from #abc) t2 on t1.s=t2.e
  where t1.Path is null
end
--选择唯一路径
select path from #abc where e not in(select s from #abc)
--路径结果如下
path                                                                                                 
---------------------------------------------------------------------------------------------------- 
1,2->2,3->3,4->4,5->
a,b->

完美解决用户要求

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值