在表上执行时,使用CONNECT BY LEVEL似乎返回太多行.正在发生的事情背后的逻辑是什么?
假设如下表:
create table a ( id number ); insert into a values (1); insert into a values (2); insert into a values (3);
此查询返回12行(SQL Fiddle).
select id,level as lvl from a connect by level <= 2 order by id,level
表A中每一行一行,列LVL的值为1,表LV中的每一行为3,其中列LVL为2,即:
ID | LVL ---+----- 1 | 1 1 | 2 1 | 2 1 | 2 2 | 1 2 | 2 2 | 2 2 | 2 3 | 1 3 | 2 3 | 2 3 | 2
它等效于此查询,返回相同的结果.
select id,level as lvl from dual cross join a connect by level <= 2 order by id,level
我不明白为什么这些查询返回12行,或者为什么有三行LVL为2,而对于ID列的每个值,只有一行LVL为1.
增加每个ID值“连接”到3 returns 13 rows的级别数. 1其中LVL是1,3,其中LVL是2和9,其中LVL是3.这似乎表明返回的行是表A中的行数,LVL的值减去1的幂.
我会想,这些查询将与以下相同,返回
6行
select id,lvl from ( select level as lvl from dual connect by level <= 2 ) cross join a order by id,lvl
在解释应该发生什么时,documentation对我来说并不是特别清楚.这些权力发生了什么,为什么前两个查询不同于第三个?
解决方法
在第一个查询中,只按级别连接.
因此,如果级别< = 1,您将获得每个记录1次.如果级别< = 2,那么您将获得每个级别1次(对于级别1)N次(其中N是表中的记录数).这就像你是交叉加入一样,因为你只是从表中挑选所有记录,直到达到等级,而没有其他条件来限制结果.对于级别< = 3,对于那些结果中的每一个再次完成. 所以有3条记录:
> Lvl 1:3记录(均为1级)
> Lvl 2:3记录具有级别1 3 * 3记录,级别2 = 12
> Lvl 3:3 3 * 3 3 * 3 * 3 = 39(实际上,每个13个记录).
> Lvl 4:开始看模式?
因此,如果级别< = 1,您将获得每个记录1次.如果级别< = 2,那么您将获得每个级别1次(对于级别1)N次(其中N是表中的记录数).这就像你是交叉加入一样,因为你只是从表中挑选所有记录,直到达到等级,而没有其他条件来限制结果.对于级别< = 3,对于那些结果中的每一个再次完成. 所以有3条记录:
> Lvl 1:3记录(均为1级)
> Lvl 2:3记录具有级别1 3 * 3记录,级别2 = 12
> Lvl 3:3 3 * 3 3 * 3 * 3 = 39(实际上,每个13个记录).
> Lvl 4:开始看模式?