表结构如下:
id val
1 aa
2 bb查询语句及结果如下:
SELECT id, level,val
FROM tab
CONNECT BY LEVEL<=31 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
求解释,谢谢大家了。
id val
1 aa
2 bb查询语句及结果如下:
SELECT id, level,val
FROM tab
CONNECT BY LEVEL<=31 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的一次方+2的二次方+2的三次方=14 aa bb
aa bb aa bb
aa bb aa bb aa bb aa bb
例如
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
id val
2 aa
4 bb
查询语句如下:
SELECT id, level,val
FROM tab
CONNECT BY LEVEL<=id
得到的结果如下:
2 1 aa
2 2 aa
4 3 bb
4 4 bb
4 2 bb
4 3 bb
4 4 bb
4 1 bb
2 2 aa
4 3 bb
4 4 bb
4 2 bb
4 3 bb
4 4 bb
14 rows selected
这个结果应该要如何解释啊?谢谢了
aa bb
aa bb aa bb
bb bb bb bb
bb bb bb bb
得到的是(AA,AA)(BB,BB)(AA,BB)(BB,AA)
AA BB和AA BB的笛卡尔积怎么会是AA,BB,AA,BB呢?
有点儿糊涂
(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
id val
2 aa
4 bb
查询出与id值相同条数的该数据:
插叙语句如下:SELECT level,id,val
FROM tab
CONNECT BY LEVEL<=id and
prior id=id and prior dbms_random.value is not null
查询结果如下:
1 2 aa
2 2 aa
1 4 bb
2 4 bb
3 4 bb
4 4 bb
这个结果是怎么的到的
语句中的prior id=id
和dbms_random.value is not null是和用法?
ERROR:
ORA-01436: CONNECT BY loop in user data
为了欺骗它,这里用了一个PRIOR DBMS_RANDOM.VALUE(相当于获取随机数), 因为DBMS_RANDOM.VALUE每次调用都返回不同结果,所以它认为两行数据不一样,所以不报错了。
所以 LZ上面这个例子 结果就是根据id来的 因为层次level<=id 而且prior id=id和DBMS_RANDOM.VALUE会过滤多余的数据 所以显示的时候 你的id值是多少 当前id的行数就会显示多少