Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle, Połącz według numeru wiersza

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wycofać, gdy wystąpi błąd podczas wykonywania polecenia programu ładującego sql?

  2. Zapytanie SQL Z Row_Number, kolejność według i gdzie klauzula

  3. Tabela lub widok Oracle DB nie istnieje

  4. Próbujesz uzyskać wynik w jednym wierszu za pomocą sql?

  5. Oracle uważa puste ciągi za NULL, podczas gdy SQL Server nie — jak najlepiej się z tym obchodzić?