sql – 为什么表上的CONNECT BY LEVEL会返回额外的行?

前端之家收集整理的这篇文章主要介绍了sql – 为什么表上的CONNECT BY LEVEL会返回额外的行?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在表上执行时,使用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:开始看模式?

猜你在找的MsSQL相关文章