sql – 为什么表上的CONNECT BY LEVEL会返回额外的行?
发布时间:2020-12-12 06:51:33 所属栏目:MsSql教程 来源:网络整理
导读:在表上执行时,使用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,lev
在表上执行时,使用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的幂. 我会想,这些查询将与以下相同,返回 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:开始看模式? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |