表结构如下:
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