日期:2014-05-17  浏览次数:20899 次

CONNECT BY用法求解
表结构如下:
id val
1 aa
2 bb

查询语句及结果如下:
SQL code
  SELECT id, level,val
        FROM tab
     CONNECT BY  LEVEL<=3

1    1    AA
1    2    AA
1    3    AA
2    3    BB
2    2    BB
1    3    AA
2    3    BB
2    1    BB
1    2    AA
1    3    AA
2    3    BB
2    2    BB
1    3    AA
2    3    BB
的出十四条记录

我想知道,Oracle是怎么处理的得出了14条记录
网上搜过其他的解释,说是没层level产生后与原数据进行笛卡尔积运算
但是我算了一下,按笛卡尔积算应该有12条,即:2*1+2*2+2*3=12
求解释,谢谢大家了。

------解决方案--------------------
对于一条记录,生成的结果集合应该是2的level次幂-1

对于例子中的,生成的结果结合是2的3次幂-1+2的3次幂-1=14
------解决方案--------------------
简单的讲就是,每一层的结果集都是基数记录与上一层的笛卡尔积。
例如
Level 1
aa bb
level 2
即为aa bb与 aa bb的笛卡尔积
即aa bb aa bb
Level 3
即为aa bb aa bb与aa bb aa bb的笛卡尔积
即aa bb aa bb aa bb aa bb

------解决方案--------------------
connect by是以树状的形式来展现的

为何会得出14条数据呢 LZ可以看下这例子 然后将层次也列出来了 容易理解一点

这是层次为3的时候 如果 为level<=4 那么将会展开出第四层 类型差不多
SQL code

with x as
    (select 'aa' chr from dual
    union all
    select 'bb' chr from dual)
    select level,chr,lpad(' ',(level-1)*5,'-')||chr other from x connect by level<=3;
 
    LEVEL CHR    OTHER
    ----- ------ ----------------------
    1     aa     aa
    2     aa     ---- aa
    3     aa     --------- aa
    3     bb     --------- bb
    2     bb     ---- bb
    3     aa     --------- aa
    3     bb     --------- bb
    1     bb     bb
    2     aa     ---- aa
    3     aa     --------- aa
    3     bb     --------- bb
    2     bb     ---- bb
    3     aa     --------- aa
    3     bb     --------- bb