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是怎么回事?说说。
分享到:
相关推荐
- **`CONNECT_BY_ISLEAF`**: 如果当前行是叶子节点则返回1,否则返回0。 - **`SYS_CONNECT_BY_PATH`**: 返回路径字符串,其中包含从根到当前节点的所有节点的值。 **示例代码:** ```sql SELECT empno, mgr, ename,...
- 获取前N条记录,例如:`SELECT * FROM (SELECT ROWNUM rnum, t.* FROM table t ORDER BY some_column) WHERE rnum <= N;` **分页查询:** - 实现分页功能,如:`SELECT * FROM (SELECT ROWNUM rnum, t.* FROM ...
create public database link dblink1 connect to db1 identified by \"123*456\" using \'db11\' 20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 <1>下面的语句可以进行总计 ...
- **取指定前几条记录**:可以通过`SELECT * FROM table ORDER BY column LIMIT n`获取前n条记录。注意,在DB2中,`LIMIT`是标准SQL的一部分。 - **游标的使用**:游标允许按行处理查询结果。使用时需要注意`COMMIT...
6. **其他辅助函数**: 如 `DECODE`, `GREATEST`, `LEAST`, `NULLIF`, `NVL`, `NVL2`, `SYS_CONNECT_BY_PATH`, `SYS_CONTEXT` 等,用于简化复杂逻辑或数据处理。 **第二节 聚集函数** 用于对一组数据进行汇总计算,...
- **从数据表中取指定前几条记录**:使用`SELECT * FROM 表名 FETCH FIRST n ROWS ONLY`可以获取前n行数据。 - **游标的使用**: - 游标提供了遍历查询结果的能力。 - `DECLARE cursor_name CURSOR FOR SELECT ...
- **从数据表中取指定前几条记录**:使用`SELECT TOP n * FROM 表名`语句可以获取表中的前n条记录。 - **游标的使用**:游标是DB2中用于遍历查询结果的一种机制。它可以逐行处理结果集。注意使用`COMMIT`和`...
- **从数据表中取指定前几条记录**:可以使用`SELECT TOP n * FROM table_name`这样的语句来获取表中前n条记录。 - **游标的使用**: - `COMMIT`和`ROLLBACK`:提交(COMMIT)用于确认事务中所做的更改;回滚...