Oracle,按行连接

时间:2018-10-19 21:04:22

标签: sql oracle hierarchical connect-by

我试图找到一些有关“引擎”连接的信息。 我发现了这篇文章: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,因此始终为true。那我步骤失败了吗?

1 个答案:

答案 0 :(得分:1)

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