`
dacoolbaby
  • 浏览: 1267336 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用Connect by进行递归查询

阅读更多
首先和使用WITH做递归查询一样,给数据库表插入一定的数据。
CREATE TABLE BBS
 (
 PARENTID INTEGER NOT NULL,
 ID INTEGER NOT NULL,
 NAME VARCHAR(200) NOT NULL
 );
insert into bbs (PARENTID,ID,NAME) values (0,1,'数据库开发');
insert into bbs (PARENTID,ID,NAME) values (1,11,'DB2');
insert into bbs (PARENTID,ID,NAME) values (11,111,'DB2 文章1');
insert into bbs (PARENTID,ID,NAME) values (111,1111,'DB2 文章1 的评论1');
insert into bbs (PARENTID,ID,NAME) values (111,1112,'DB2 文章1 的评论2');
insert into bbs (PARENTID,ID,NAME) values (11,112,'DB2 文章2');
insert into bbs (PARENTID,ID,NAME) values (1,12,'Oracle');
insert into bbs (PARENTID,ID,NAME) values (0,2,'Java 技术');
COMMIT;

select * from BBS  
start with name = ‘DB2文章1的评论2’  --从某一个节点开始,进行向上递归
connect by prior PARENTID = ID;  --连接条件

查询结果为:
PARENTID   ID   NAME
111       1112    DB2文章1的评论2
11        111     DB2文章1
1         11      DB2
0         1       数据库开发

但是如果你的递归循环中出现了死循环,这条SQL就执行不了了。
如果你要忽略报错执行该SQL,可以使用NOCYCLE关键字,如下。
INSERT INTO BBS(PARENTID,ID,NAME)VALUES(111,1,’DB2论文’);

select * from BBS  
start with name = ‘DB2文章1的评论2’  --从某一个节点开始,进行向上递归
connect by prior PARENTID = ID;  --连接条件
NOCYCLE

在CONNECT BY语句上面还可以增加一些辅助的伪列,如:
level:标记层级级数,最上层节点为1,之后为2、3……。
CONNECT_BY_ISCYCLE:标记此节点是否为某一个祖先节点的父节点,导致循环,1为是,0为否。
CONNECT_BY_ISLEAF :标记此节点是否为叶子节点,即没有子节点,1为是,0为否。
CONNECT_BY_ROOT:标记此节点的祖先节点,后面加列名或表达式,取祖先节点的记录值。
EXAMPLE:
select a.child,
       a.PARENTID,
       level "层次",
       sys_connect_by_path(ID, '->') "合并层次",
       prior a.PARENTID "父节点",
       connect_by_root a.ID "根节点",
       decode(connect_by_isleaf, 1, a.ID, null) "子节点",
       decode(connect_by_isleaf, 1, '是', '否') "是否子节点"
from BBS a
start with name = ‘DB2文章1的评论2’  --从某一个节点开始,进行向上递归
connect by NOCYCLE prior PARENTID = ID;  --连接条件
0
0
分享到:
评论

相关推荐

    数据库设计之递归树查询

    以下是在Oracle中进行递归查询的例子: ```sql SELECT id, name, CONNECT_BY_ROOT id AS root_id FROM employees START WITH id = some_employee_id CONNECT BY PRIOR id = manager_id; ``` 六、注意事项与优化 1....

    Oracle start with.connect by prior子句实现递归查询

    #### 使用`Start With.Connect By Prior`进行递归查询 1. **查询以`root_id=0`作为根节点的所有记录**: ```sql SELECT * FROM t2 START WITH root_id = 0 CONNECT BY PRIOR id = root_id; ``` 这条SQL语句...

    connect_by_prior_递归算法

    ### Oracle中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...

    MySQL多种递归查询方法.docx

    在Oracle数据库中,递归查询可以通过`START WITH CONNECT BY PRIOR`语句实现。此语句允许用户按照树状结构来检索数据。 ##### 1. `START WITH CONNECT BY PRIOR`用法详解 **基本语法**: ```sql SELECT * FROM ...

    递归查询菜单树,支持mysql,oracle

    Oracle数据库也支持递归查询,但使用的是`CONNECT BY`语句。对于同样的`menus`表,Oracle的查询可能如下: ```sql SELECT id, parent_id, name, level as depth FROM menus START WITH parent_id IS NULL CONNECT ...

    Oracle递归树形结构查询功能

    在进行递归查询优化时,要注意避免无限循环和性能问题,确保`CONNECT BY`条件正确无误,必要时还可以使用`CYCLE`子句来检测并处理循环引用。同时,合理利用索引可以显著提升查询效率。 总之,Oracle的递归树形结构...

    connect by的使用探索

    1. 列出上下级关系:使用Connect By语句可以递归地查询树形结构的数据,实现上下级关系的查询。 2. 构造序列:Connect By语句可以用于构造序列,例如生成一系列的日期或数字。 3. 实现排列组合:Connect By语句可以...

    在db2和oracle中的对树的递归查询语句

    除了基本的递归查询,我们还可以在这些查询中加入其他SQL语句,如`WHERE`子句进行条件过滤,或者`ORDER BY`进行结果排序。同时,为了防止无限递归,通常会设置一个最大递归深度,比如Oracle的`CONNECT_BY_ISCYCLE`和...

    oracle递归查询的例子

    除了基本的递归查询之外,还可以结合其他功能进行更复杂的查询,比如加入 `LEVEL` 关键字来获取当前记录的层级编号,或使用 `CYCLE` 关键字来检测循环引用等。 ##### 示例:添加 LEVEL 和 CYCLE 为了更好地理解递归...

    dhtmlx tree 使用,与oracle递归查询的结合

    在Oracle中,进行递归查询通常使用的是`CONNECT BY`子句,它可以遍历层次结构数据,例如组织结构或具有层级关系的产品目录。递归查询允许我们从一个起点开始,通过指定的连接条件递归地获取所有相关的子节点。 **...

    oracle递归、迭代

    本文将详细介绍如何在Oracle中使用递归查询,并通过具体的示例来展示其用法。 #### 二、递归查询的基础概念 递归查询是Oracle中一种特殊的查询方式,主要用于检索具有层次结构的数据。在Oracle中实现递归查询需要...

    oracle-递归查询地区名称

    oracle 递归调用 地区 ,用到的方法是 SYS_CONNECT_BY_PATH,可以扩展层级 名称

    10.2.0.3版本 with改造递归查询

    - 从`ghsj_xm.pub_cant`表中选取符合条件的数据,使用`CONNECT BY`子句进行递归连接,并排除特定的`cant_code`值。 - 使用`DECODE`函数根据`level`字段的不同值设置`super_code`。 - **外部查询**: - 在`tas`临时...

    Oracle中的树状查询(递归查询)

    递归查询基于`CONNECT BY`子句,它允许我们定义一个起始点并根据特定条件进行递归。`PRIOR`关键字用于指定当前行与父行的关系。通过这些工具,Oracle可以构建出一个层次结构,展示出数据的树状关系。 2. **基本...

    Oracle递归查询

    通过使用`START WITH`和`CONNECT BY PRIOR`关键字,我们可以轻松地实现从上级到下级、从下级到上级或两表连接等多种类型的递归查询。希望本文能够帮助您更好地理解和应用Oracle中的递归查询技术。

    ORACLE查询树型关系(connect_by_prior_start_with)

    使用 START WITH 和 CONNECT BY 子句可以实现 SQL 的层次查询,并且可以使用 SYS_CONNECT_BY_PATH 函数和 CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、CONNECT_BY_ISCYCLE 等伪列函数来增强层次查询的能力。

    在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现.pdf

    CONNECT BY子句通常配合START WITH子句使用,其中START WITH指定了递归的起点,而CONNECT BY用于定义父子关系。CONNECT BY子句中的PRIOR关键字用于表示层级之间的连接,它指向前一个步骤得到的列值。例如,如果当前...

    Oracle递归SQL学习

    因此,合理设计表结构,例如使用自连接而不是递归,或者限制递归深度,对于优化查询性能至关重要。 至于Velocity模板语言,它并不支持递归渲染。这意味着在生成HTML或其他格式的输出时,如果需要递归地展示树结构,...

    DB2递归实现

    DB2递归实现 DB2递归实现是指在DB2数据库管理系统中实现递归查询的...但是,需要注意DB2递归实现的缺点,例如需要使用公共表表达式(CTE)和UNION ALL,需要编写复杂的查询语句,需要下载和解压CONNECT_BY.zip文件。

    Oracle 递归函数介绍

    在 Oracle 中,递归函数可以使用 CONNECT BY 语句来实现递归查询。CONNECT BY 语句的基本语法如下所示: ```sql SELECT ... FROM ... START WITH ... CONNECT BY ... ``` 其中,`START WITH` 子句指定了递归查询的...

Global site tag (gtag.js) - Google Analytics