日期:2014-05-16  浏览次数:20661 次

深入理解Oracle中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;

[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