`

树-Oracle用Start with...Connect By子句递归查询

    博客分类:
  • sql
阅读更多
Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。
创建示例表:
CREATE TABLE TBL_TEST
(
  ID    NUMBER,
  NAME  VARCHAR2(100 BYTE),
  PID   NUMBER                                  DEFAULT 0
);
 
插入测试数据:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
 
从Root往树末梢递归
select * from TBL_TEST
 start with id=1
 connect by prior id = pid
 
从末梢往树ROOT递归
select * from TBL_TEST
 start with id=5
 connect by prior pid = id
=====

对于oracle进行简单树查询(递归查询)

DEPTID PAREDEPTID NAME
NUMBER NUMBER CHAR (40 Byte)
部门id 父部门id(所属部门id) 部门名称

通过子节点向根节点追朔.

Sql代码 复制代码
  1. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid   
 select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 

 

通过根节点遍历子节点.

Sql代码 复制代码
  1. select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid   
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid 

 

可通过level 关键字查询所在层次.

Sql代码
  1. select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid   
select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid 

 

再次复习一下:start with ...connect by 的用法, start with 后面所跟的就是就是递归的种子

递归的种子也就是递归开始的地方 connect by 后面的"prior" 如果缺省:则只能查询到符合条件的起始行,并不进行递归查询;

connect by prior 后面所放的字段是有关系的,它指明了查询的方向

练习: 通过子节点获得顶节点

Sql代码 复制代码
  1. select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from persons.dept start with deptid=76 connect by prior paredeptid=deptid  

====这种方法只是当表里就有一颗树,多棵树怎么办?

分享到:
评论
4 楼 fengzhongtian 2009-06-17  
<div class="quote_title">心似海 写道</div>
<div class="quote_div">
<div>Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。</div>
<div>创建示例表:</div>
<div>CREATE TABLE TBL_TEST<br>(<br>  ID    NUMBER,<br>  NAME  VARCHAR2(100 BYTE),<br>  PID   NUMBER                                  DEFAULT 0<br>);</div>
<div> </div>
<div>插入测试数据:</div>
<div>INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');<br>INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');<br>INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');<br>INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');<br>INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');</div>
<div> </div>
<div>从Root往树末梢递归</div>
<div>select * from TBL_TEST<br> start with id=1<br> connect by prior id = pid</div>
<div> </div>
<div>
<div>从末梢往树ROOT递归</div>
<div>select * from TBL_TEST<br> start with id=5<br> connect by prior pid = id</div>
<div>=====</div>
<div>
<h1>对于oracle进行简单树查询(递归查询)</h1>
<p> </p>
<table border="0"><tbody>
<tr>
<td>DEPTID</td>
<td>PAREDEPTID</td>
<td>NAME</td>
</tr>
<tr>
<td>NUMBER</td>
<td>NUMBER</td>
<td>CHAR (40 Byte)</td>
</tr>
<tr>
<td>部门id</td>
<td>父部门id(所属部门id)</td>
<td>部门名称</td>
</tr>
</tbody></table>
<p> </p>
<p>通过子节点向根节点追朔.</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" href="/topic/191016"><img src="/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-sql">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">select</span></strong></span><span> * </span><span class="keyword"><strong><span style="color: #7f0055;">from</span></strong></span><span> persons.dept start </span><span class="keyword"><strong><span style="color: #7f0055;">with</span></strong></span><span> deptid=76 </span><span class="keyword"><strong><span style="color: #7f0055;">connect</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">by</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">prior</span></strong></span><span> paredeptid=deptid   </span></span></li>
</ol>
</div>
<pre name="code" class="sql"> select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid </pre>
<p> </p>
<p>通过根节点遍历子节点. </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" href="/topic/191016"><img src="/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-sql">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">select</span></strong></span><span> * </span><span class="keyword"><strong><span style="color: #7f0055;">from</span></strong></span><span> persons.dept start </span><span class="keyword"><strong><span style="color: #7f0055;">with</span></strong></span><span> paredeptid=0 </span><span class="keyword"><strong><span style="color: #7f0055;">connect</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">by</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">prior</span></strong></span><span> deptid=paredeptid   </span></span></li>
</ol>
</div>
<pre name="code" class="sql">select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid </pre>
<p> </p>
<p>可通过level 关键字查询所在层次. </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 </div>
</div>
<ol class="dp-sql">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">select</span></strong></span><span> a.*,</span><span class="keyword"><strong><span style="color: #7f0055;">level</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">from</span></strong></span><span> persons.dept a start </span><span class="keyword"><strong><span style="color: #7f0055;">with</span></strong></span><span> paredeptid=0 </span><span class="keyword"><strong><span style="color: #7f0055;">connect</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">by</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">prior</span></strong></span><span> deptid=paredeptid   </span></span></li>
</ol>
</div>
<pre name="code" class="sql">select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid </pre>
<p> </p>
<p>再次复习一下:start with ...connect by 的用法,<strong> <em><span style="text-decoration: underline;">start with</span></em></strong> 后面所跟的就是就是<span style="color: #ff0000;"><strong>递归的种子</strong></span>。 </p>
<p><span style="color: #ff0000;">递归的种子也就是递归开始的地方</span> connect by 后面的"prior" 如果缺省:则只能查询到符合条件的起始行,并不进行递归查询; </p>
<p>connect by prior 后面所放的字段是有关系的,<strong><span style="text-decoration: underline;">它指明了查询的方向</span></strong>。 </p>
<p>练习: 通过子节点获得顶节点 </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" href="/topic/191016"><img src="/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-sql">
<li><span><span class="keyword"><strong><span style="color: #7f0055;">select</span></strong></span><span> FIRST_VALUE(deptid) OVER (</span><span class="keyword"><strong><span style="color: #7f0055;">ORDER</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">BY</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">LEVEL</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">DESC</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">ROWS</span></strong></span><span> UNBOUNDED PRECEDING) </span><span class="keyword"><strong><span style="color: #7f0055;">AS</span></strong></span><span> firstdeptid </span><span class="keyword"><strong><span style="color: #7f0055;">from</span></strong></span><span> persons.dept start </span><span class="keyword"><strong><span style="color: #7f0055;">with</span></strong></span><span> deptid=76 </span><span class="keyword"><strong><span style="color: #7f0055;">connect</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">by</span></strong></span><span> </span><span class="keyword"><strong><span style="color: #7f0055;">prior</span></strong></span><span> paredeptid=deptid  </span></span></li>
</ol>
</div>
</div>
</div>
<p><span class="t18"><span style="color: #ff0000;">====这种方法只是当表里就有一颗树,多棵树怎么办?</span><br></span></p>
</div>
<p> </p>
3 楼 alan6288 2009-05-07  
不错,我还不知道Oracle有这样的功能呢,上次为了查询一个系统几百个功能模块的关系,搞了N多子查询呢。
值得收藏学习啊
2 楼 511543417 2009-05-02  
好贴。我什么时候才能写出这样的帖子呢。看来我的努力了!!!··
1 楼 zhanght327 2009-02-13  
谢谢楼主 学习了

相关推荐

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

    ### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...

    树状数据库表:Oracle中start with...connect by prior子句用法

    本文将详细讲解如何利用`START WITH...CONNECT BY PRIOR`子句来构建和查询树形数据库表。 `START WITH...CONNECT BY PRIOR`是Oracle SQL中的一个特性,用于处理具有层级关系的数据。这个子句允许我们遍历和查询具有...

    ORACLE查询树型关系(connect_by_prior_start_with)

    Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 ...

    Oracle递归树形结构查询功能

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

    oracle递归、迭代

    在Oracle中实现递归查询需要用到`START WITH... CONNECT BY PRIOR`语法。 #### 三、递归查询的基本语法 递归查询的基本语法如下: ```sql SELECT column_name(s) FROM table_name START WITH start_condition ...

    Oracle_start_with_connect_by_prior_用法

    3. **过滤条件的影响**:`WHERE`子句是在已经通过`START WITH`和`CONNECT BY PRIOR`确定的记录集中进一步筛选,它不会影响到递归的路径。 #### 五、注意事项 - 在使用`START WITH`和`CONNECT BY PRIOR`时,需要确保...

    Oracle 递归函数介绍

    其中,`START WITH` 子句指定了递归查询的起始点,`CONNECT BY` 子句指定了递归查询的连接条件。 在上面的示例代码中,我们创建了一个名为 `T_DEPT_HP` 的表,并插入了一些示例数据。然后,我们可以使用递归函数来...

    oracle-tree-sql.rar_oracle

    本资料"oracle-tree-sql.rar_oracle"主要探讨的就是如何在Oracle中使用SQL查询树形结构数据。 一、Oracle树结构查询基础 1.1 连接查询(Connect By) Oracle的Connect By子句是处理层次数据的核心工具。它允许...

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

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

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

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

    oracle树结构查询.DOC

    Oracle数据库系统支持对树状结构数据的查询,这种查询方式主要通过`START WITH`和`CONNECT BY`子句实现。这两个子句是Oracle特有的,用于处理层级关系的数据,例如组织结构、产品分类或者树形菜单等。理解并掌握这两...

    Oracle递归查询start with connect by prior的用法

    在Oracle中,`START WITH` 和 `CONNECT BY` 是进行递归查询的关键字,它们允许我们从一个特定的根节点出发,沿着预定义的关系链接遍历整个树形结构。本文将深入探讨这两个关键字的用法,并通过实例来说明其在实际...

    connect by的使用探索

    其中,`START WITH`子句用于指定查询的起始节点,`CONNECT BY`子句用于指定查询的递归条件。 Connect By的执行原理 Connect By语句的执行原理可以用以下程序来说明: ```sql for rec in (select * from some_table...

    10.2.0.3版本 with改造递归查询

    Oracle数据库支持通过`CONNECT BY`和`START WITH`子句实现递归查询。递归查询通常用于处理层次结构数据,如组织结构、文件系统等。 ##### 2. WITH子句 WITH子句是Oracle SQL中的一个特性,它允许用户定义一个临时...

    oracle递归查询的例子

    - **START WITH 子句**:这里指定了递归查询的起点,即当 `relation` 字段值为 `1` 的记录作为根节点开始查询。 - **CONNECT BY PRIOR 子句**:定义了递归关系。在这里,`PRIOR id` 表示当前记录的父节点(上一级)...

    Oracle查询树形结构

    需要注意的是,在使用START WITH...CONNECT BY PRIOR进行查询时,需要考虑到循环引用的问题,因为这样的查询结构容易出现无限递归的情况。为了防止查询过程中出现死循环,应当确保在使用CONNECT BY子句时,父节点和...

    oracle菜单树查询

    oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询

    connect_by_prior_递归算法

    ### Oracle中的Connect By Prior递归算法详解 ...通过正确地设置`START WITH`、`CONNECT BY`和`WHERE`子句,可以有效地查询和分析复杂的数据结构。理解其工作原理有助于更好地利用Oracle的功能来满足各种业务需求。

    TN-HDB-0003-HANA SQL参考及Oracle对照-v0.6.docx

    - 在Oracle和HANA中,都可以使用`START WITH...CONNECT BY PRIOR`来执行递归查询,以构建树形结构的数据集。例如,查询具有父子关系的部门结构。两者在语法上基本一致,但HANA不支持Oracle中的`level`和`siblings`...

    Oracle递归SQL学习

    通过理解`start with`、`connect by prior`和`order siblings by`的用法,我们可以有效地展示和操作层次数据。不过,实际应用时要注意性能优化,避免因递归深度过大而导致的问题,并考虑在模板渲染时的替代方案。

Global site tag (gtag.js) - Google Analytics