connect by 用法小议

本文探讨了在Oracle数据库中使用CONNECTBY生成序列时LEVEL与ROWNUM的区别,并通过实例展示了不同场景下这两种方法如何影响结果集的数量。

生成连续序列或递归上下级树形结构时常用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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值