`

connect by level<n返回的记录条数

 
阅读更多
connect by是ORACLE 提供的层查询时用的,遍历树状。
语法是:
select lpad(ename,(level-1)*4+20,' '),mgr,LEVEL from emp where 1=1 connect by prior empno=mgr start with mgr is null;

start with指定作为根结点的条件,如start with mgr is null,则指定了从mgr为空的行即king的行开始。 如果没有指定start with条件时,则会把每一条记录做为根结点,然后把当然前结点及其它结点作为其子结点。

这里只讨厌select xx from xx connect by level <n时返回的记录数目。

CREATE TABLE a (ID NUMBER,VARCHAR2(10));
insert into a values(1,'a')
insert into a values(2,'b')
insert into a values(3,'c')
commit;

SELECT a.id,a.name ,LEVEL FROM a CONNECT BY LEVEL<2;
1 a 1
2 b 1
3 c 1
SELECT a.id,a.name ,LEVEL FROM a CONNECT BY LEVEL<3;
1 a 1
1 a 2
2 b 2
3 c 2
2 b 1
1 a 2
2 b 2
3 c 2
3 c 1
1 a 2
2 b 2
3 c 2
SELECT a.id,a.name ,LEVEL FROM a CONNECT BY LEVEL<4;
1 a 1
1 a 2
1 a 3
2 b 3
3 c 3
2 b 2
1 a 3
2 b 3
3 c 3
3 c 2
1 a 3
2 b 3
3 c 3
2 b 1
1 a 2
1 a 3
2 b 3
3 c 3
2 b 2
1 a 3
2 b 3
3 c 3
3 c 2
1 a 3
2 b 3
3 c 3
3 c 1
1 a 2
1 a 3
2 b 3
3 c 3
2 b 2
1 a 3
2 b 3
3 c 3
3 c 2
1 a 3
2 b 3
3 c 3
SELECT a.id,a.name ,LEVEL FROM a CONNECT BY LEVEL<5;这个自己实验吧。

可以看到:
当level<2时,所有的记录的levle都是1,也就是树的深度为1.即把所有记录都当着根结点,深度为1的树保有一层,故只有根,所以只有3条记录。此时是这样的:a   b     c
 
当levle<3时,level=1或2,树的尝试为2,将a\b\c作为根结点递归:
level=1的 a   b   c
level=2的:
a->a         a->b      a->c      
b->a         b->b      b->c
c->a         c->b       c->c
共返回12条记录
 
当level<4时,树的深度为3层:
level=1和2的同上面的。
a->a->a      a->a->b         a->a->c       a->b->a        a->b->b        a->b->c       a->c->a      a->c->b       a->c->c
同样b也是这样
level=3的共有9*3=27条,加上上面的一共有27+12=39条

 
当表中有3条记录时:
level=1      返回记录数:a1=3*power(3,0)=3
level=2      返回记录数:a2=s1+3*power(3,1)=12
level=3      返回记录数:a3=s2+3*power(3,2)=39
故:an=3*power(3,0)+3*power(3,1)+3*power(3,2).....3*power(3,n-1)可以得出,an为等比数列的和,故
an=a(power(q,n)-1)/q-1  这里a=q(递归时的比是按照表的记录条数算的),最终得到:an=a(power(a,n)-1)/a-1.(a为表中的记录条数,n为层数)
a=3,n=1,an=3
a=3,n=2,an=12
a=3,n=3,an=39
.........

由此得出:connect by level <n返回的记录数目与表中的记录及层数有关。在表只有单条记录时,返回n-1条记录,当表记录数>1时,返回记录条数an=a(power(q,n)-1)/q-1 .下次看到别人写 connect by level<n(不带start wtih子句),应该知道怎么回事了吧

connect by 应用于需要递归的地方,故在需要递归的地方可以考虑,不过如果没有树形关系时,connect by会变的很复杂,需仔细分析。


谁知道  connect by rownum<n是怎么回事?说说。

分享到:
评论

相关推荐

    oracle connect by level 应用

    Oracle的`CONNECT BY LEVEL`是数据库查询中用于构建层次结构数据的一种强大工具,尤其是在处理具有层级关系的数据时,如组织架构、产品分类等。本文将深入探讨`CONNECT BY`子句以及`LEVEL`伪列的使用,以帮助你更好...

    connect by prior数据库树的应用

    `PRIOR` 关键字在 `Connect By Prior` 语法中扮演着重要的角色,它用来指代上一层级的记录。具体来说: - 当使用 `PRIOR column_name = parent_column_name` 时,表示当前行的 `column_name` 值应当等于父行的 `...

    connect by的使用

    在`CONNECT BY`查询中,可以使用`LEVEL`伪列来表示节点在层级中的深度,`LEVEL`从1开始,对于每个新层级递增1。 4. **排序与筛选** - `ORDER SIBLINGS BY` 子句用于在每个层级内对兄弟节点进行排序。 - 可以使用`...

    connect by的使用探索

    这个程序说明了Connect By语句的执行原理,即从起始节点开始,递归地遍历整个树形结构,直到遍历完整个表的所有记录。 Connect By的使用场景 Connect By语句可以实现多种功能,例如: 1. 列出上下级关系:使用...

    Oracle的Connect By使用示例

    - **解释**:利用`SYS_CONNECT_BY_PATH`函数构建出每条记录的路径表达式,有助于理解整个层级结构。 - **结果**:输出了以ID为1的记录为根节点的所有路径表达式。 5. **叶子节点路径**: ```sql SELECT LTRIM...

    connect_by_prior_递归算法

    例如,`CONNECT BY PRIOR org_id = parent_id`表示当前记录的`parent_id`字段应该与上一条记录的`org_id`相匹配。 - **条件3(过滤条件)**:用于进一步筛选返回的记录。这些条件可以是任意的逻辑表达式。 #### 五...

    Oracle start with.connect by prior子句实现递归查询

    CONNECT BY PRIOR &lt;parent_column&gt; = &lt;child_column&gt;; ``` 其中: - `&lt;table_name&gt;`:需要查询的数据表名。 - `&lt;start_condition&gt;`:指定递归查询的起始条件,通常为一个确定的记录。 - `&lt;parent_column&gt;`:父节点...

    浅谈Oracle下connect by原理.pdf

    CONNECT BY LEVEL &lt;= regexp_count('a,b,c,d,e,f', '[^,]+'); ``` 这里利用了Oracle的正则表达式功能,通过`regexp_substr`函数与`CONNECT BY`结合,实现了将字符串按照指定分隔符(这里是逗号)进行分割,并以表的...

    树状数据库表:Oracle中start with...connect by prior子句用法

    例如,你可以使用`CONNECT BY PRIOR ID = PARENT_ID AND LEVEL &lt;= 5`,这将遍历到第五级的子节点。 4. **LEVEL伪列**: Oracle在`CONNECT BY`查询过程中自动提供了一个`LEVEL`伪列,它表示当前行在树结构中的深度...

    connect_by_path和connect_by_root比较总结

    通过实例比较了 SYS_CONNECT_BY_PATH 和 CONNECT_BY_ROOT 的异同,和返回树形的数据结构

    快速生成10万条测试数据

    SELECT level FROM dual CONNECT BY LEVEL &lt;= N; ``` 其中 `N` 是指定的最大行数。例如,如果我们想要生成100000行数据,则可以设置 `N = 100000`。 ##### 2. `ROWNUM` 的用法 `ROWNUM` 是另一个伪列,用于返回...

    Oracle_start_with_connect_by_prior_用法

    这条SQL语句将从ID=1的部门开始递归查找,并且只返回名字中含有“销售”的部门。 ##### 示例4:理解PRIOR关键字的作用 如果希望只查询出满足特定条件的单个记录,而不递归地查找其子节点或父节点,可以使用`PRIOR`...

    oracle Connect By使用

    Connect By 可以列出上下级关系 构造序列 求排列组合 逆转求出下上级的关系路径

    Oracle数据行拆分多行方法示例

    FROM t, (SELECT level AS lv FROM dual CONNECT BY level &lt; 10) b WHERE b.lv &lt;= REGEXP_COUNT(t.col, '\.') + 1; ``` 4. 多行拆分 - 方法三 利用`TABLE`函数和`MULTISET`操作,将拆分的结果转换为集合类型`...

    oracle connect by 和 分析函数总结.doc

    CONNECT BY &lt;Conditional-3&gt;; ``` - `&lt;Conditional-1&gt;`:用于筛选满足特定条件的记录。 - `START WITH`:定义树的起始点,即根节点。 - `CONNECT BY`:指定层级之间的关联条件,通常是当前行的一个字段与上一行...

    Oracle中如何用一条SQL快速生成10万条测试数据.txt

    在这个例子中,我们使用了`LEVEL &lt;= 100000`来确保生成10万条记录。`LEVEL`会从1开始递增,直到达到指定的上限(这里是100000)。 #### 2. 使用`ROWNUM`作为唯一标识符 `ROWNUM`是Oracle中的一个伪列,它为每一行...

    将 CONNECT BY 移植到 DB2

    Oracle 使用 `CONNECT BY` 子句以及 `LEVEL`, `PRIOR`, `CONNECT_BY_ROOT` 等伪列来实现递归查询。相比之下,DB2 使用递归 CTE 和 `UNION ALL` 来实现相同的功能。 #### 动机 在将应用从 Oracle 迁移到 DB2 的过程...

    start connect by

    `LEVEL` 是一个伪列,它在`CONNECT BY`查询中自动产生,表示当前行在层次结构中的深度。在第二个示例中,`SELECT ... LEVEL` 显示了每个员工在其所在层级的位置,帮助我们理解整个组织的结构。 需要注意的是,在...

    ORACLE查询树型关系(connect_by_prior_start_with)

    使用 START WITH 和 CONNECT BY 子句可以实现 SQL 的层次查询,并且可以使用 SYS_CONNECT_BY_PATH 函数和 CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、CONNECT_BY_ISCYCLE 等伪列函数来增强层次查询的能力。

    Oracle中connect by...start with...的使用

    本文章详细介绍了Oracle中connect by...start with...的用法。

Global site tag (gtag.js) - Google Analytics