`

深入了解start with .....connect by (一)

阅读更多
START WITH . . . CONNECT BY . . .子句常用来实现SQL的层次查询.刚才看到一个蛮有趣的帖子,楼主用了数学方法深入研究了connect by
原帖子如下。

对于connect by,现在大多数人已经很熟悉了
connect by中的条件就表示了父子之间的连接关系
比如 connect by id=prior pid

但如果connect by中的条件没有表示记录之间的父子关系
那会出现什么情况?
常见的,connect by会在构造序列的时候使用
用select rownum from dual connect by rownum<xxx 代替早期版本的 select rownum from all_objects where rownum <xxx

我们注意到,dual是一个只有一条记录的表,如果表有多条记录,将会怎样?

下面开始实验
环境:windows xp sp2 + Oracle 9208
(10.1版本connect by有问题)

CREATE TABLE T
(
  ID  VARCHAR2(1 BYTE)
);

INSERT INTO T ( ID ) VALUES (
'A');
INSERT INTO T ( ID ) VALUES (
'B');
INSERT INTO T ( ID ) VALUES (
'C');
COMMIT;


SQL> select rownum from dual connect by rownum<10;

    ROWNUM
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9

9 rows selected.

SQL> select id,level from t connect by level<2;

I      LEVEL
- ----------
A          1
B          1
C          1

SQL> select id,level from t connect by level<3;

I      LEVEL
- ----------
A          1
A          2
B          2
C          2
B          1
A          2
B          2
C          2
C          1
A          2
B          2

I      LEVEL
- ----------
C          2

12 rows selected.

SQL> select id,level from t connect by level<4;

I      LEVEL
- ----------
A          1
A          2
A          3
B          3
C          3
B          2
A          3
B          3
C          3
C          2
A          3

I      LEVEL
- ----------
B          3
C          3
B          1
A          2
A          3
B          3
C          3
B          2
A          3
B          3
C          3

I      LEVEL
- ----------
C          2
A          3
B          3
C          3
C          1
A          2
A          3
B          3
C          3
B          2
A          3

I      LEVEL
- ----------
B          3
C          3
C          2
A          3
B          3
C          3

39 rows selected.

SQL> 



无需多说,我们很快可以找到其中的规律,假设表中有N条记录
则记F(N,l)为 select id,level from t connect by level<l 的结果集数目
那么,
F(N,1)=N
F(N,l) = F(N,l-1)*N+N

于是可以总结出
F(N,l)=∑power(N,p), p取值为[1,l)


要解释,也很容易
当连接条件不能限制记录之间的关系时
每一条记录都可以作为自己或者其他记录的叶子
如下所示:
A          1
A          2
A          3
B          3
C          3
B          2
A          3
B          3
C          3
C          2
A          3
B          3
C          3

在这里,我们看到的是
Oracle采用了深度优先的算法



转摘自:http://www.cnblogs.com/zeromyth/archive/2009/09/07/1561948.html
分享到:
评论

相关推荐

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

    `START WITH...CONNECT BY PRIOR`是Oracle SQL中的一个特性,用于处理具有层级关系的数据。这个子句允许我们遍历和查询具有父子关系的数据,例如部门和其下属子部门,或者员工和他们的上级经理。 1. **START WITH...

    Oracle中connect by...start with...的使用

    本文章详细介绍了Oracle中connect by...start with...的用法。

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

    在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织结构、产品分类、文件系统等场景中,通过递归查询可以方便地获取树状或层级...

    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递归查询start with connect by prior的用法

    connect by:connect by是必须的,start with有些情况是可以省略的,或者直接start with 1=1不加限制 prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,...

    oracle数据库startwith用法

    接下来,我们将使用 `START WITH` 和 `CONNECT BY` 来查询这个表,并构建出一个树状结构。 ##### 构建层级结构 如果我们想从 `ID = 1` 这一行开始构建层级结构,可以使用如下的SQL语句: ```sql SELECT * FROM ...

    connect by的使用探索

    [ WHERE condition ][ [ START WITH condition ] CONNECT BY condition [ ORDER SIBLINGS BY expression ] ] ``` 其中,`START WITH`子句用于指定查询的起始节点,`CONNECT BY`子句用于指定查询的递归条件。 ...

    Oracle_start_with_connect_by_prior_用法

    ### Oracle中的START WITH CONNECT BY PRIOR 用法详解 #### 一、概念介绍 在Oracle数据库中,`START WITH` 和 `CONNECT BY PRIOR` 是两个非常强大的特性,主要用于处理具有层级结构的数据。这两个特性可以帮助我们...

    Oracle_start_with_connect_by_prior_用法[文].pdf

    Oracle 连接查询是指使用 START WITH 和 CONNECT BY 语句来实现递归查询的方法,这种方法可以生成树形结构的数据。在 Oracle 中,START WITH 语句用于指定递归查询的开始记录,而 CONNECT BY 语句用于指定递归查询的...

    start connect by

    在SQL查询中,`START WITH` 和 `CONNECT BY` 是两个关键的子句,它们用于构建层次结构查询,通常在处理具有上下级关系的数据时非常有用,如员工与经理的关系、组织结构或者产品分类等。这两个子句是Oracle数据库特有...

    Effective.Robotics.Programming.with.ROS.3rd.Ed.epub

    Successfully design and simulate your 3D robot model and use powerful robotics algorithms and tools to program and set up your robots with an unparalleled experience by using the exciting new features...

    Oracle的Connect By使用示例

    Oracle数据库通过提供`START WITH...CONNECT BY`语句来简化这类查询操作。此功能最早出现在Oracle 8.1.6版本,并一直沿用至今,成为处理递归查询的强大工具之一。 #### 二、Connect By与Start With详解 1. **...

    MySQL多种递归查询方法.docx

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

    浅谈Oracle下connect by原理.pdf

    文章中给出了一个名为`t_test_connectby`的数据表例子,其中包含父子关系的节点数据。通过该表,我们可以更直观地了解Connect By的执行过程。 - 不指定起始条件时,使用`CONNECT BY`: ```sql SELECT * FROM t_test...

    connect by的使用

    - 可以使用`WHERE`子句在查询中添加额外的过滤条件,但要注意,`WHERE`子句应在`START WITH`之后,`CONNECT BY`之前,否则可能无法正确处理层级关系。 5. **使用示例** 假设我们有一个部门表`DEPARTMENTS`,包含`...

    oracle connect by level 应用

    本文将深入探讨`CONNECT BY`子句以及`LEVEL`伪列的使用,以帮助你更好地理解和应用这一特性。 `CONNECT BY`是Oracle SQL中用于处理树形数据结构的关键字,它允许我们根据指定的连接条件遍历层级关系。通常,`...

    Making Games with Python & PyGame.pdf(with code)

    Source Code for Hello World with Pygame ................................................................................ 7 Setting Up a Pygame Program ....................................................

Global site tag (gtag.js) - Google Analytics