sql >> Database >  >> RDS >> Oracle

Waarom retourneert CONNECT BY LEVEL op een tafel extra rijen?

In de eerste query verbindt u alleen door het niveau. Dus als niveau <=1, krijgt u elk van de records 1 keer. Als niveau <=2, dan krijg je elk niveau 1 keer (voor niveau 1) + N keer (waarbij N het aantal records in de tabel is). Het is alsof je aan het cross-joinen bent, omdat je gewoon alle records van de tafel plukt totdat het niveau is bereikt, zonder andere voorwaarden om het resultaat te beperken. Voor niveau <=3 wordt dit opnieuw gedaan voor elk van die resultaten.

Dus voor 3 records:

  • Lvl 1:3 record (allemaal met niveau 1)
  • Lvl 2:3 records met niveau 1 + 3*3 records met niveau 2 =12
  • Lvl 3:3 + 3*3 + 3*3*3 =39 (inderdaad 13 records elk).
  • Lvl 4:begin je een patroon te zien? :)

Het is niet echt een cross-join. Een cross join retourneert alleen die records met niveau 2 in dit zoekresultaat, terwijl u met deze verbinding door zowel de records met niveau 1 als de records met niveau 2 krijgt, wat resulteert in 3 + 3*3 in plaats van alleen 3*3-record.



  1. CAST()-functie in Oracle

  2. Kolomrechten retourneren van een gekoppelde server in SQL Server (T-SQL-voorbeelden)

  3. Een string splitsen in Oracle

  4. SqlTransaction gebruiken in C#