度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
楼主: 万望
打印 上一主题 下一主题

[分享] Oracle 的递归语句(select…start with…connect by…prior)

[复制链接]

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
11#
 楼主| 发表于 2020-3-13 17:19:58 | 只看该作者
陈晓龙 发表于 2016-4-12 18:54
不错,说得很详细!

你看完了吗?

点评

看了一部分!  详情 回复 发表于 2020-3-13 21:52
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
12#
 楼主| 发表于 2020-3-13 17:24:44 | 只看该作者
以下是一系列针对树结构的更深层次的查询,这里的查询不一定是最优的查询方式,或许只是其中的一种实现而已。

6)、查询一个节点的兄弟节点(亲兄弟)。
  1. --m.parent=m2.parent-->同一个父亲
  2. select * from tb_menu m
  3. where exists (select * from tb_menu m2 where m.parent=m2.parent and m2.id=6)
复制代码
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
13#
 楼主| 发表于 2020-3-13 17:25:34 | 只看该作者
7)、查询与一个节点同级的节点(族兄弟)。 如果在表中设置了级别的字段,那么在做这类查询时会很轻松,同一级别的就是与那个节点同级的,在这里列出不使用该字段时的实现!
  1. with tmp as(
  2.       select a.*, level leaf        
  3.       from tb_menu a               
  4.       start with a.parent is null     
  5.       connect by a.parent = prior a.id)
  6. select *                              
  7. from tmp                             
  8. where leaf = (select leaf from tmp where id = 50);
复制代码
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
14#
 楼主| 发表于 2020-3-13 17:27:57 | 只看该作者
万望 发表于 2016-4-13 17:25
7)、查询与一个节点同级的节点(族兄弟)。 如果在表中设置了级别的字段,那么在做这类查询时会很轻松,同 ...

这里使用两个技巧,一个是使用了level来标识每个节点在表中的级别,还有就是使用with语法模拟出了一张带有级别的临时表。
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
15#
 楼主| 发表于 2020-3-13 17:37:53 | 只看该作者
8)、查询一个节点的父节点的的兄弟节点(伯父与叔父)。
  1. with tmp as(
  2.     select tb_menu.*, level lev
  3.     from tb_menu
  4.     start with parent is null
  5.     connect by parent = prior id)
  6.    
  7. select b.*
  8. from tmp b,(select *
  9.             from tmp
  10.             where id = 21 and lev = 2) a
  11. where b.lev = 1

  12. union all

  13. select *
  14. from tmp
  15. where parent = (select distinct x.id
  16.                 from tmp x, --祖父
  17.                      tmp y, --父亲
  18.                      (select *
  19.                       from tmp
  20.                       where id = 21 and lev > 2) z --儿子
  21.                 where y.id = z.parent and x.id = y.parent);
复制代码

这里查询分成以下几步。
首先,将第7个一样,将全表都使用临时表加上级别;
其次,根据级别来判断有几种类型,以上文中举的例子来说,有三种情况:
(1)当前节点为顶级节点,即查询出来的lev值为1,那么它没有上级节点,不予考虑。
(2)当前节点为2级节点,查询出来的lev值为2,那么就只要保证lev级别为1的就是其上级节点的兄弟节点。
(3)其它情况就是3以及以上级别,那么就要选查询出来其上级的上级节点(祖父),再来判断祖父的下级节点都是属于该节点的上级节点的兄弟节点。
最后,就是使用union将查询出来的结果进行结合起来,形成结果集。
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

198

主题

1313

帖子

3784

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3784
16#
发表于 2020-3-13 17:42:59 | 只看该作者
oracle的递归查询与SQLserver的递归查询写法有所不同。
回复 支持 反对

使用道具 举报

198

主题

1313

帖子

3784

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3784
17#
发表于 2020-3-13 17:44:24 | 只看该作者
SQLserver的递归也写来用用
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
18#
发表于 2020-3-13 21:52:20 | 只看该作者

看了一部分!
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
19#
 楼主| 发表于 2020-3-14 22:28:11 | 只看该作者
9)、查询一个节点的父节点的同级节点(族叔)。
这个其实跟第7种情况是相同的。
  1. with tmp as(
  2.       select a.*, level leaf        
  3.       from tb_menu a               
  4.       start with a.parent is null     
  5.       connect by a.parent = prior a.id)
  6. select *                              
  7. from tmp                             
  8. where leaf = (select leaf from tmp where id = 6) - 1;
复制代码

基本上,常见的查询在里面了,不常见的也有部分了。其中,查询的内容都是节点的基本信息,都是数据表中的基本字段,但是在树查询中还有些特殊需求,是对查询数据进行了处理的,常见的包括列出树路径等。
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9378

积分

论坛元老

Rank: 8Rank: 8

积分
9378
20#
 楼主| 发表于 2020-3-14 22:28:48 | 只看该作者
万望 发表于 2016-4-14 22:28
9)、查询一个节点的父节点的同级节点(族叔)。
这个其实跟第7种情况是相同的。

补充一个概念,对于数据库来说,根节点并不一定是在数据库中设计的顶级节点,对于数据库来说,根节点就是start with开始的地方。
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

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

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-12-23 14:49 , Processed in 0.133011 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表