sql - 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 所以它总是正确的。所以我是失败的步骤吗?
解决方案
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
推荐阅读
- android - Android appflow部署不更新设备
- python - 使用 Pandas 数据框绘制 Holoviews.Image
- firebase - 颤动-手机中未显示firebase消息
- kubernetes - 在 Kubernetes 中,将文件中的机密公开为环境变量
- entity-framework - 实体框架.刷新上下文
- php - SQLSTATE = 23502 出现在我部署的网站上。(通过上传 .csv)
- python - 将悬停文本添加到 Plotly 散点图线或散点图线的多种颜色
- javascript - 返回或推送字符串 Char
- export - Sqoop 导出失败并出现 NumberFormatException
- excel - 如何将多个句子中的每个单词放入Excel中的文本单元格?