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

Dlaczego CONNECT BY LEVEL w tabeli zwraca dodatkowe wiersze?

W pierwszym zapytaniu łączysz się tylko według poziomu. Więc jeśli poziom <=1, otrzymasz każdy z rekordów 1 raz. Jeśli poziom <=2, otrzymujesz każdy poziom 1 raz (dla poziomu 1) + N razy (gdzie N jest liczbą rekordów w tabeli). To tak, jakbyś łączyła się krzyżowo, ponieważ po prostu wybierasz wszystkie rekordy z tabeli, aż do osiągnięcia poziomu, bez innych warunków ograniczających wynik. Dla poziomu <=3 jest to powtarzane dla każdego z tych wyników.

A więc dla 3 rekordów:

  • Rekord lvl 1:3 (wszystkie na poziomie 1)
  • Lvl 2:3 rekordy na poziomie 1 + 3*3 rekordy na poziomie 2 =12
  • Poziom 3:3 + 3*3 + 3*3*3 =39 (rzeczywiście, po 13 rekordów).
  • Poziom 4:zaczynasz widzieć wzór? :)

To naprawdę nie jest sprzężenie krzyżowe. Sprzężenie krzyżowe zwróciłoby tylko te rekordy, które w tym wyniku zapytania mają poziom 2, podczas gdy w przypadku tego połączenia przez otrzymujesz rekordy o poziomie 1, a także rekordy o poziomie 2, co daje w wyniku 3 + 3*3 zamiast samego Rekord 3*3.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wartości nie są wyświetlane z wiodącym zerem w Oracle

  2. Konwertuj typ danych znacznika czasu na znacznik czasu uniksa Oracle

  3. Tabele zewnętrzne Oracle

  4. Labirynt dostrajania wydajności

  5. Jak wybrać z kolumny typu obiektu w Oracle 11g?