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