Wyjaśnienie w odpowiedzi Krokodiłki jest po prostu błędne. Możesz zignorować znak „Poprawna odpowiedź” i liczne głosy za, to nadal jest błędne. Ciekawe, że pozostawił jako ćwiczenie dokładnie ten przypadek, który dowodzi, że wyjaśnienie jest błędne.
CONNECT BY
zapytanie nie działa „jak gdyby” nowe tabele (lub nowe wyjściowe zestawy wierszy SELECT
w każdym razie oświadczenia) są generowane na każdym kroku. To jest błąd w argumentacji.
Jest raczej tylko jeden zestaw wierszy wygenerowany ogólnie (we wszystkich krokach). Prawdą jest, że nowe wiersze są dodawane na podstawie wierszy wygenerowanych w poprzednim kroku; ale sam zestaw wierszy jest jednym i rośnie, a nie oddzielnymi zestawami wierszy.
Jest to szczególnie istotne w przypadku ROWNUM
. ROWNUM
jest przypisywany do wierszy w jednym zestawie wierszy „wynik”, zaczynając od 1. W CONNECT BY
zapytanie, istnieje tylko jeden zestaw wierszy, a ROWNUM
przechodzi od 1 do n w rosnącej kolejności.
Jeśli odpowiedź Krokodilki była poprawna, to ROWNUM
uruchomi się ponownie od 1 na każdym kroku. Oczywiście tak nie jest:wypróbujmy to na „standardowym” zapytaniu hierarchicznym.
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