Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125988
  • 博文数量: 39
  • 博客积分: 2565
  • 博客等级: 少校
  • 技术积分: 360
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-13 10:13
文章分类
文章存档

2013年(2)

2012年(2)

2011年(3)

2010年(3)

2009年(3)

2008年(10)

2007年(4)

2006年(12)

我的朋友

分类: Oracle

2006-09-21 10:57:35

oracle 树的使用

以前看过start with... connect by.....这样的语法,不过一直没在工作中用过。现在用上了,而且要求还蛮怪,费了不少劲。主要是公司目前没有招新DBA,再复杂的SQL也得自己写。晚上正好遇到jean在线,请教了一下,还是蛮有收获的,在此向jean同学表示感谢!
 
dev 和 group 是多对多关系(devicegroupassignment),group 可以有父group,group是一个典型的树结构。
比如数据结构为:
dg1 : dev1, dev2
dg2 : dev3, dev4, dg2的父group为dg1
 
期望查询的结果为:
dg1, dev1
dg1, dev2
dg1, dev3
dg1, dev4
dg2, dev3
dg2, dev4
 
最终的查询语句为:
select distinct dg.dg_id, dga.dga_dev_id
from devicegroupconfig dg, devicegroupassignment dga
where dga.dga_dg_id in
(select dg_id from devicegroupconfig start with dg_id = dga.dga_dg_id connect by dg_parent_id = prior dg_id)
 
jean说有点strange,建议用sys_connect_by_path() 这个函数,这样就可以得到一个group的完整路径,然后用substr来得到这个group。也是可行的方法,个人还是喜欢直接通过表连接来实现。
阅读(1094) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~