首页 > 解决方案 > Oracle,按 rownum 连接

问题描述

我试图通过“引擎”查找有关连接的一些信息。我发现了这篇文章:Confusion with Oracle CONNECT BY

用户 krokodilko 回答说:

The analyze of the last query:

select level from dual connect by rownum<10;
I leave to you as a homework assignment.

所以我尝试完全按照描述进行查询

Select rownum from dual connect by rownum < 3

这是我的“工作”:

CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
SELECT * FROM step1;

create table step2 as
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR" on rownum <=3;
SELECT * FROM step2;
create table step3 as
select 3 "LEVEL" from dual
join step2 "PRIOR" on rownum <=3;
SELECT * FROM step3;
create table step4 as
select 4 "LEVEL" from dual
join step3 "PRIOR" on rownum <=3;
SELECT * FROM step4;

但最后一个 SELECT 仍然返回行。我误解了什么吗?每次我选择 LEVEL + 1 "LEVEL" 它都有 rownum = 1 所以它总是正确的。所以我是失败的步骤吗?

标签: sqloraclehierarchicalconnect-by

解决方案


Krokodilko 的回答中的解释是完全错误的。您可以无视“正确答案”标记和众多赞成票,它仍然是错误的。有趣的是,他作为练习留下了证明解释错误的案例。

CONNECT BY查询不会“好像”在每一步都生成新表(或语句的新输出行集)SELECT。这是论证中的错误。

相反,总体上只生成一个行集(跨所有步骤)。确实是根据上一步生成的行添加新行;但是行集本身是一个并且不断增长的行集,而不是单独的行集。

这与ROWNUM. ROWNUM被分配给单个“结果”行集中的行,从 1 开始。在CONNECT BY查询中,只有一个行集,并且ROWNUM以递增的顺序从 1 变为 n。

如果 Krokodilko 的答案是正确的,那么ROWNUM将在每一步从 1 重新开始。显然情况并非如此:让我们在“标准”分层查询中尝试一下。

select     empno, ename, mgr, level, rownum
from       scott.emp
start with mgr is null
connect by prior empno = mgr
;

     EMPNO ENAME             MGR      LEVEL     ROWNUM
---------- ---------- ---------- ---------- ----------
      7839 KING                           1          1
      7566 JONES            7839          2          2
      7788 SCOTT            7566          3          3
      7876 ADAMS            7788          4          4
      7902 FORD             7566          3          5
      7369 SMITH            7902          4          6
      7698 BLAKE            7839          2          7
      7499 ALLEN            7698          3          8
      7521 WARD             7698          3          9
      7654 MARTIN           7698          3         10
      7844 TURNER           7698          3         11
      7900 JAMES            7698          3         12
      7782 CLARK            7839          2         13
      7934 MILLER           7782          3         14

推荐阅读