当前位置: 代码迷 >> Oracle管理 >> CONNECT BY用法求解,该怎么处理
  详细解决方案

CONNECT BY用法求解,该怎么处理

热度:54   发布时间:2016-04-24 05:13:23.0
CONNECT BY用法求解
表结构如下:
id val
1 aa
2 bb

查询语句及结果如下:
SQL code
  SELECT id, level,val        FROM tab     CONNECT BY  LEVEL<=31    1    AA1    2    AA1    3    AA2    3    BB2    2    BB1    3    AA2    3    BB2    1    BB1    2    AA1    3    AA2    3    BB2    2    BB1    3    AA2    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
  相关解决方案