oracle connec用法,深入懂得Oracle中connect by用法

深入理解Oracle中connect by用法

对于connect by,现在大多数人已经很熟悉了

connect by中的条件就表示了父子之间的连接关系

比如 connect by id=prior pid

但如果connect by中的条件没有表示记录之间的父子关系

那会出现什么情况?

常见的,connect by会在构造序列的时候使用

用select rownum from dual connect by rownum

我们注意到,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;

[Copy to clipboard] [ - ]

CODE:

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

C          2

已选择12行。

1       A

2       B

C

对应的树:

--1    A

--2    A

--2    B

--2    C

--1    B

--2    A

--2    B

--2    C

--1    C

--2    A

--2    B

--2    C

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

B          3

C          3

B          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

C          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

已选择39行。

1      A

2      B

3      C

对应的树:

--1     A

--2    A

--3    A

--3    B

--3    C

--2    B

--3    A

--3    B

--3    C

--2    C

--3    A

--3    B

--3    C

--1     B

--2    A

--3    A

--3    B

--3    C

--2    B

--3    A

--3    B

--3    C

--2    C

--3    A

--3    B

--3    C

--1     C

--2    A

--3    A

--3    B

--3    C

--2    B

--3    A

--3    B

--3    C

--2    C

--3    A

--3    B

--3    C

无需多说,我们很快可以找到其中的规律,假设表中有N条记录

则记F(N,l)为 select id,level from t connect by level

那么,

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

B          2

C          2

B          1A          2

B          2

C          2

C          1

A          2

B          2

C          2

在这里,我们看到的是

Oracle采用了深度优先的算法

http://www.blogjava.net/wxqxs/archive/2008/08/15/222338.html

http://www.cnblogs.com/lettoo/archive/2010/08/03/1791239.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值