深入了解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 99 rows selected.SQL> select id,level from t connect by level<2;I LEVEL- ----------A 1B 1C 1SQL> select id,level from t connect by level<3;I LEVEL- ----------A 1A 2B 2C 2B 1A 2B 2C 2C 1A 2B 2I LEVEL- ----------C 212 rows selected.SQL> select id,level from t connect by level<4;I LEVEL- ----------A 1A 2A 3B 3C 3B 2A 3B 3C 3C 2A 3I LEVEL- ----------B 3C 3B 1A 2A 3B 3C 3B 2A 3B 3C 3I LEVEL- ----------C 2A 3B 3C 3C 1A 2A 3B 3C 3B 2A 3I LEVEL- ----------B 3C 3C 2A 3B 3C 339 rows selected.SQL>