oracle 的 start with ... connect by ...

语法:

  select * from some_table

[where 条件1]

connect by [条件2]

start with [条件3];

其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要。

 [where 条件1]、[条件2]、[条件3]各自作用的范围都不相同:

 [where 条件1]

是在根据“connect by [条件2] start with [条件3]”选择出来的记录中进行过滤,是针对单条记录的过滤, 不会考虑树的结构(最后的过滤);

 [ connect by 条件2]

指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉;

 [ start with 条件3]

限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是限定作为叶子节点的条件;

要根据connect by 从上到下还是从下到上,来确定起始节点,可能是叶节点,也可能是父节点,这些开始节点可以是多个,并且包含这些节点。

==========================================================================

例子:

表结构:

-- Create table

create table A

(

  id NUMBER,

  name VARCHAR2(20),

  pid NUMBER

)

select * from A start with id=2 connect by prior id=pid;--从父到子(从上到下)

select * from A start with id=2 connect by prior pid= id; --从子到父  (从下到上)

select * from A start with id=2 connect by pid= id;   --不会进行循环

对prior的理解

1.prior可以不要,不要的时候只能查找到符合“start with [条件3]”的记录,不会在寻找这些记录的子节点或父节点。

2.

connect by prior id=pid  采用自上而下的搜索方式(先找父节点然后找子节点)

connect by id=prior pid采用自下而上的搜索方式(先找叶子节点然后找父节点)

从子节点到父节点,则prior指的是子节点,构造出从子节点到父节点的关系,即子节点的pid=父节点的id (prior pid=id) ;从父节点到子节点,则prior指的是父节点,构造出从父节点到子节点的关系,即父节点的id=子节点的pid(proid id =pid)。

3.prior id=pid 和 pid=prior id  效果是一样的。

时间: 2024-10-29 00:55:48

oracle 的 start with ... connect by ...的相关文章

Oracle中start with...connect by子句的用法

connect by 是结构化查询中用到的,其基本语法是:select - from tablename start with 条件1connect by 条件2where 条件3;例:select * from tablestart with org_id = 'HBHqfWGWPy'connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:org_id,parent_id那么通过表示每一条记录的parent是谁

oracle 中 Start with...connect by 的用法(递归查询)

阿里电面问到了相关的知识,在网上找到这方面的文章. 这几个关键字是查询递归数据的,形成一个树状结构.目前只有oracle支持,其他数据都要结合存储过程实现 语法: select * from some_table [where 条件1] connect by [条件2] start with [条件3]; 其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要.  [where 条件1].[条件2].[条件3]各自作用的范围都不

powerDesigner 连接Oracle 报Unable to connect SQLState=08004 解决方法

powerDesigner 报Unable to connect SQLState=08004 解决方法 环境:win7(64) powersigner 15 oracle 10G 错误提示: Unable to connect SQLState=08004 [Oracle][ODBC][Ora]ORA-12154:TNS:无法解析指定的连接标示符 解决方法: 看看是不是把powerDesigner安装在了有空格的目录下,如果是重新安装在非空目录即可. 分类: windows 7 powerDe

Oracle高级查询之CONNECT BY

为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. Oracle中的select语句可以用start with ... connect by prior ...子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... from where <过滤条件,用于对返回的所有记录进行过滤>start with <根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树>connect by [prior

Oracle层级询语句connect by 用法详解

如果表中包含层级数据,那么你就可以使用层级查询从句选择行层级顺序. 1.层级查询从句语法 层级查询从句语法: { CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ]| START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...} START WITH:指定层级的跟节点行. CONNECT BY:指定层级的父行于

oracle中 start with .. connect by prior.. 用法简介

我们经常会将一个比较复杂的目录树存储到一个表中.或者将一些部门存储到一个表中,而这些部门互相有隶属关系.这个时候你就会用到connect by prior start with.oracle 提供了start with connect by 语法结构可以实现递归查询. connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by prior 条件2 where 条件3; 例: select *

Oracle中start with connect by prior用法

最近看到Oracle中有一个很好用的查询,它就是start with connect by prior,说白了就是递归算法.  如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系基本语法: [ START WITH CONDITION1 ]CONNECT BY [ NOCYCLE ] CONDITION2[ NOCYCLE ]参数暂时不解释例: select empno, ename, job, mgr, hiredate, sal, comm, deptno, lev

oracle 的 start with connect by prior 学习

语法: SELECT ... FROM    + 表名 START WITH         + 条件1 CONNECT BY PRIOR   + 条件2 WHERE              + 条件3 说明: 这个方法是用来查询树状结构的数据的.举个例子,我们有一个这样的结构 然后建一个这样的表,插入数据. CREATE TABLE TEST( ID NUMBER(2) PRIMARY KEY, PARENT_ID NUMBER(2) ); INSERT INTO TEST (ID, PAR

plsql 安装Some Oracle Net versions cannot connect from a path with parentheses

在plsql安装的时候出现了如下提示: 按照错误信息的提示,一开始还以为oarcle因为安装路径问题导致识别不了,后来才发现.是plsql的安装路径带有圆括号才有这样的错误提示 如下图: 修改plsql的安装路径,选择不带圆括号的安装路径.该 错误就可以解决了. 安装成功截图如下: