生成连续序列或递归上下级树形结构时常用CONNECT BY来实现
1、CONNECT BY 的执行顺序
语法:[start with ...][where .....] connect by ...
先执行START WITH 后执行CONNECT BY,最后执行WHERE子句
2、生成序列注意事项,多用LEVEL,而少用ROWNUM,有时ROWNUM会引起问题
SQL> select level from dual connect by level<5;
LEVEL
----------
1
2
3
4
SQL> select rownum from dual connect by rownum<5;
ROWNUM
----------
1
2
3
4
当查询表中只有一条记录时,两种用法是相同的
但是当查询表中有多于一条记录时,两则的差异还是蛮大的
SQL> select * from t;
N
-
A
B
SQL> select rownum,level,n from t connect by level<=1;
ROWNUM LEVEL N
---------- ---------- -
1 1 A
2 1 B
SQL> select rownum,level,n from t connect by level<=2;
ROWNUM LEVEL N
---------- ---------- -
1 1 A
2 2 A
3 2 B
4 1 B
5 2 A
6 2 B
已选择6行。
SQL> select rownum,level,n from t connect by level<=3;
ROWNUM LEVEL N
---------- ---------- -
1 1 A
2 2 A
3 3 A
4 3 B
5 2 B
6 3 A
7 3 B
8 1 B
9 2 A
10 3 A
11 3 B
12 2 B
13 3 A
14 3 B
已选择14行。
SQL> select rownum,level,n from t connect by rownum<=1;
ROWNUM LEVEL N
---------- ---------- -
1 1 A
2 1 B
SQL> select rownum,level,n from t connect by rownum<=2;
ROWNUM LEVEL N
---------- ---------- -
1 1 A
2 2 A
3 1 B
SQL> select rownum,level,n from t connect by rownum<=3;
ROWNUM LEVEL N
---------- ---------- -
1 1 A
2 2 A
3 3 A
4 1 B
假设表记录为N,层数为M
使用LEVEL获取的记录数为:N^M+N^(M-1)+...+N
使用ROWNUM获取的记录数为:M+N-1
本文探讨了在Oracle数据库中使用CONNECTBY生成序列时LEVEL与ROWNUM的区别,并通过实例展示了不同场景下这两种方法如何影响结果集的数量。

1076

被折叠的 条评论
为什么被折叠?



