日期:2014-05-16 浏览次数:20607 次
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是怎么回事?说说。