查看: 6479|回复: 13

【大话IT】树形结构存储的表查询问题

[复制链接]
论坛徽章:
23
兰博基尼
日期:2015-04-20 18:33:262014年世界杯参赛球队: 瑞士
日期:2015-04-20 18:33:262014年世界杯参赛球队: 洪都拉斯
日期:2015-04-20 18:33:262014年世界杯参赛球队: 阿尔及利亚
日期:2015-04-20 18:33:26马上有钱
日期:2015-04-20 18:33:26马上有对象
日期:2015-04-20 18:33:26沸羊羊
日期:2015-04-20 18:33:26慢羊羊
日期:2015-04-20 18:33:26喜羊羊
日期:2015-04-21 10:00:44itpub13周年纪念徽章
日期:2015-05-07 14:11:42
发表于 2015-1-25 10:53 | 显示全部楼层 |阅读模式
是这样,一个表treeTable里的数据是按树形结构存储的,比如a是b的父节点,b是c的父节点,一直这样下去,可能有很多level,不确定。

现在要查询一个node下所有的node,如何查询呢?
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2015-1-25 14:01 来自手机 | 显示全部楼层
用简单的数据举例, 并贴出结果

使用道具 举报

回复
论坛徽章:
23
兰博基尼
日期:2015-04-20 18:33:262014年世界杯参赛球队: 瑞士
日期:2015-04-20 18:33:262014年世界杯参赛球队: 洪都拉斯
日期:2015-04-20 18:33:262014年世界杯参赛球队: 阿尔及利亚
日期:2015-04-20 18:33:26马上有钱
日期:2015-04-20 18:33:26马上有对象
日期:2015-04-20 18:33:26沸羊羊
日期:2015-04-20 18:33:26慢羊羊
日期:2015-04-20 18:33:26喜羊羊
日期:2015-04-21 10:00:44itpub13周年纪念徽章
日期:2015-05-07 14:11:42
 楼主| 发表于 2015-1-25 22:17 | 显示全部楼层
本帖最后由 xuhao167 于 2015-1-25 22:19 编辑
bell6248 发表于 2015-1-25 14:01
用简单的数据举例, 并贴出结果

比如下面一个表,有两个字段col1和col2,其中col1是col2的直接父节点,如何检索出a的所有子节点
  1. col1 col2
  2. a     b
  3. b    c
  4. c    d
  5. c    e
复制代码

使用道具 举报

回复
论坛徽章:
6
2010广州亚运会纪念徽章:板球
日期:2010-11-15 11:29:572010广州亚运会纪念徽章:足球
日期:2010-11-15 11:30:022013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-20 06:00:12沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-1-26 08:57 | 显示全部楼层
xuhao167 发表于 2015-1-25 22:17
比如下面一个表,有两个字段col1和col2,其中col1是col2的直接父节点,如何检索出a的所有子节点

select * from emp start with empno =7566 connect by prior empno =  mgr

使用道具 举报

回复
论坛徽章:
23
兰博基尼
日期:2015-04-20 18:33:262014年世界杯参赛球队: 瑞士
日期:2015-04-20 18:33:262014年世界杯参赛球队: 洪都拉斯
日期:2015-04-20 18:33:262014年世界杯参赛球队: 阿尔及利亚
日期:2015-04-20 18:33:26马上有钱
日期:2015-04-20 18:33:26马上有对象
日期:2015-04-20 18:33:26沸羊羊
日期:2015-04-20 18:33:26慢羊羊
日期:2015-04-20 18:33:26喜羊羊
日期:2015-04-21 10:00:44itpub13周年纪念徽章
日期:2015-05-07 14:11:42
 楼主| 发表于 2015-1-26 09:10 | 显示全部楼层
abstractcyj 发表于 2015-1-26 08:57
select * from emp start with empno =7566 connect by prior empno =  mgr

不太懂,下面是我的表数据,你看改如何写
  1. > select * from treeTable;
  2. +------+------+
  3. | col1 | col2 |
  4. +------+------+
  5. | a    | b    |
  6. | b    | c    |
  7. | c    | d    |
  8. | c    | e    |
  9. +------+------+
  10. 4 rows in set
复制代码

使用道具 举报

回复
论坛徽章:
52
ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42优秀写手
日期:2014-07-02 06:00:12马上有车
日期:2014-07-31 10:56:20马上有车
日期:2014-08-12 09:40:15马上有车
日期:2014-10-13 09:47:12沸羊羊
日期:2015-03-02 10:51:07慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39射手座
日期:2015-07-30 16:00:47巨蟹座
日期:2015-08-11 11:22:47
发表于 2015-1-26 09:42 | 显示全部楼层
with taba as
(select 'a' col1,'b' col2 from dual
union all
select 'b' col1,'c' col2 from dual
union all
select 'c' col1,'d' col2 from dual
union all
select 'c' col1,'e' col2 from dual)
select col1,col2 from taba
start with col1='a'
connect by   prior col2=col1;

使用道具 举报

回复
论坛徽章:
23
兰博基尼
日期:2015-04-20 18:33:262014年世界杯参赛球队: 瑞士
日期:2015-04-20 18:33:262014年世界杯参赛球队: 洪都拉斯
日期:2015-04-20 18:33:262014年世界杯参赛球队: 阿尔及利亚
日期:2015-04-20 18:33:26马上有钱
日期:2015-04-20 18:33:26马上有对象
日期:2015-04-20 18:33:26沸羊羊
日期:2015-04-20 18:33:26慢羊羊
日期:2015-04-20 18:33:26喜羊羊
日期:2015-04-21 10:00:44itpub13周年纪念徽章
日期:2015-05-07 14:11:42
 楼主| 发表于 2015-1-26 10:11 | 显示全部楼层
yhqtxy1314 发表于 2015-1-26 09:42
with taba as
(select 'a' col1,'b' col2 from dual
union all

THKS了

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-1-26 10:31 | 显示全部楼层
xuhao167 发表于 2015-1-26 09:10
不太懂,下面是我的表数据,你看改如何写

mysql?

使用道具 举报

回复
论坛徽章:
23
兰博基尼
日期:2015-04-20 18:33:262014年世界杯参赛球队: 瑞士
日期:2015-04-20 18:33:262014年世界杯参赛球队: 洪都拉斯
日期:2015-04-20 18:33:262014年世界杯参赛球队: 阿尔及利亚
日期:2015-04-20 18:33:26马上有钱
日期:2015-04-20 18:33:26马上有对象
日期:2015-04-20 18:33:26沸羊羊
日期:2015-04-20 18:33:26慢羊羊
日期:2015-04-20 18:33:26喜羊羊
日期:2015-04-21 10:00:44itpub13周年纪念徽章
日期:2015-05-07 14:11:42
 楼主| 发表于 2015-1-26 11:38 | 显示全部楼层
〇〇 发表于 2015-1-26 10:31
mysql?

,mysql 要写过程了,这就是oracle的强大之处啊

使用道具 举报

回复
论坛徽章:
6
2014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08优秀写手
日期:2014-02-27 06:00:02问答徽章
日期:2014-04-13 19:36:532015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
发表于 2015-2-3 11:27 | 显示全部楼层
这个时候就体现出数据结构设计的重要性了。

如果你的节点编码毫无规律,只能用connect by之类的高级特性,并且通常性能也不是很好。

如果你的节点编码有规律,比如:
ID
-------------------
001
001001
001002
001003
001003001
001003002
004

这时候你只需要使用like匹配即可取到某棵子树的所有节点:
where ID like '001003%'




使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表