クロコディルコの答えの説明は単に間違っています。あなたは「正解」マークと多数の賛成票を無視するかもしれません、それはまだ間違っています。説明が間違っていることを証明するケースを彼が演習として残したのは興味深いことです。
CONNECT BY
クエリは「あたかも」新しいテーブル(またはSELECT
の新しい出力行セット)として機能しません とにかく、ステートメント)は各ステップで生成されます。これは議論の誤りです。
むしろ、1つしかありません 全体的に(すべてのステップで)生成された行セット。前のステップで生成された行に基づいて新しい行が追加されるのは事実です。ただし、行セット自体は1つであり、個別の行セットではなく、成長しています。
これは、ROWNUM
に関して特に関係があります。 。 ROWNUM
1から始まる単一の「結果」行セットの行に割り当てられます。CONNECT BY
クエリでは、行セットは1つだけで、ROWNUM
昇順で1からnになります。
クロコディルコの答えが正しければ、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