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:开始看模式?

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03