假设我们现在有如下结构的数据(T_Topic)
TopicID ParentID TopicTitle
1 null 请教Oracle
选取树状数据
2 1 re:请教Oracle
选取树状数据
3 1 其实只要这样就可以
4 1 我也有同样的问题,学习
5 1 顶!
6 5 不要发垃圾贴哦~
7 3 学习ing
8 3 不是Oracle的方法呀
9 6 我喜欢顶,咋地
10 9 封号!
大家注意看,上面的这些记录其实都是TopicID=1的纪录的相关记录(子记录或者孙记录,总归是后代记录)
我们现在需要使用一条语句选择以TopicID为1记录的全部后代记录,请看下面的SQL:
SELECT TopicID,ParentID,TopicTitle FROM T_TOPIC CONNECT BY PRIOR TopicID = ParentID START WITH TopciID = 1
通过这条SQL,我们就可以一次从Table中选取TopiID=1的纪录的全部后代记录及其自身。这条语句的关键部分就是 CONNECT BY PRIOR... START WITH,这句话的标准语法如下
SELECT FROM TABLENAME CONNECT BY {PRIOR 列名1 = 列名2 | 列名1 = PRIOR 列名2 } [START WITH];
CONNECT BY 关键字用于设定关联的两个字段,PRIOR
关键字用于设定优先参照字段,START WITH
关键字用于设定切入点。看到这三个关键字的说明,大家一定会想到一个问题,既然可以对不同的字段进行优先参照,那既然可以通过根节点选出其全部的子节点,
那么也应该可以通过子节点来选取其全部的祖先节点了,因为PRIOR的优先设定就是在设定其搜索的方向。如果PRIOR设定为自节点优先,则会选取本节点
的全部后代节点,反之如果PRIOR设定为父节点优先,就可以逆向得到全部的祖先节点了,还是以上面的数据为例,我们从“封号”这条记录作为切入点,使用
如下的SQL
SELECT TopicID,ParentID,TopicTitle FROM T_TOPIC CONNECT BY TopicID = PRIOR ParentID START WITH TopicID = 10
我们就能一次性选出如下的数据记录,也就是从“封号”这条记录开始的全部祖先节点
TopicID ParentID TopicTitle
10 9 封号!
9 6 我喜欢顶,咋地
6 5 不要发垃圾贴哦~
5 1 顶!
1 null 请教Oracle选取树状数据
以上我们就讲解了如何通过一个切入点找到某一个节点的全部后代节点或者全部祖先节
点,也许您会说了,我并不需要选取全部,我只要选两层,我的树只允许显示两层。嗯,没错,这也会是常见的需求之一,不过不要紧,我们可以通过加入一个新的
关键字 Level
,使用这个关键字,我们就可以控制被选出的关系层。具体的用法,我们还是以第二个SQL需求作为例子,现在假设是需要从“封号”这条数据向上找两层祖先节
点出来,该如何操作呢?让我们来看SQL
SELECT Topic,ParentID,TopicTitle FROM T_TOPIC WHERE LEVEL <= 3 CONNECT BY TopicID = PRIOR ParentID START WITH TopicID = 10
大家一定注意到了这条SQL中多了这样一段子句 LELVEL <= 3
,这个就是用来限定选取层级的子句,这条子句就确保了我们可以选取包括节点以及其向上两层祖先节点一共三层节点。LEVEL
这个子句的变化也让你得到一些更加变态[-_-!]的结果,例如我只要取当前节点的祖父节点,那只要将 Level 设定为 Level =
3,去掉一个小于号就能满足一个变态的需求了 LEVEL 除了可以设定为普通的大于、小于、等于、大于等于、小于等于之外,甚至还可以设定为
BETWEEN X AND Y,实在是一个很不错的关键字,可以让我们满足很多变态的需求。
以上就是关于 CONNECTY BY ... PRIOR ... START WITH 的基本使用方法。当然了,用户的需求永远是BT的,不过我相信通过上面的这些基本应用的组合,一定可以满足大家的需求。
相关推荐
Oracle start with.connect by prior子句实现递归查询
NULL 博文链接:https://yunqiang-zhang-hotmail-com.iteye.com/blog/1312354
主要给大家介绍了关于Oracle递归查询start with connect by prior、的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
oracle中的数查询,介绍的详细,有例子。
oracle中 connect by prior 递归算法 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的
Oracle_start_with_connect_by_prior_用法[文].pdf
Oracle 递归查询, start with connect by prior 用法 find_in_set 函数 concat,concat_ws,group_concat 函数 MySQL 自定义函数 手动实现 MySQL 递归查询 Oracle 递归查询 在 Oracle 中是通过 start ...
ORACLE查询树型关系(connect_by_prior_start_with)
Oracle row_number()over start with...connect by prior start with...connect by prior
一、 ORA-01436报错 开发遇到一个报错 ORA-01436: CONNECT BY loop in user data (ORA-01436: 用户数据中的 CONNECT BY 循环)。...CONNECT BY PRIOR r1.region_id = r1.parent_id; 如果数据在region
介绍了将多行转为字符串的三种方案,并比较了三种方案的执行效率. 1.sys_connect_by_path + start with ... connect by ... prior + 分析函数 2.自定义Function/SP 3.使用 Oracle 10g 内置函数 wmsys.wm_concat
Connect to a server and parse JSON data Take advantage of CocoaPods to use third-party libraries Utilize a clean and effective architecture to decrease complexity and speed up development Work with ...
select * from table1 c start with c.p_id='0000000' connect by prior c.id=c.p_id and c.use_yn='Y' order by id ; 2. 查询节点中所有的层级关系 SELECT RPAD( ' ', 2*(LEVEL-1), '-' ) || DEPNAME "DEPNAME",...
oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询
criteria.add(Restrictions.sqlRestriction("MENUITEM_ID in(select a.MENUITEM_ID from Wuxin_MENUITEM a connect by prior a.MENUITEM_ID = a.PARENT_ID"+ " start with a.MENUITEM_ID = '"+parentId+"')" )); ...
Oracle使用递归查询。查询树结构的sql。在Oracle中,递归查询要用到start with ……connect by prior……
前言 对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到...select 1 from 表格 start with … connect by prior id = pId start with
在使用start with connect by prior进行树型查询时,若是需要对数据进行过滤时,其过滤条件的位置需要慎重考虑。过滤条件的位置会对查询结果造成不同的影响。