Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum gibt CONNECT BY LEVEL für eine Tabelle zusätzliche Zeilen zurück?

In der ersten Abfrage verbinden Sie sich nur über die Ebene. Wenn also Ebene <=1 ist, erhalten Sie jeden der Datensätze 1 Mal. Wenn Ebene <=2, erhalten Sie jede Ebene 1 Mal (für Ebene 1) + N Mal (wobei N die Anzahl der Datensätze in der Tabelle ist). Es ist, als würden Sie Cross Joining durchführen, weil Sie einfach alle Datensätze aus der Tabelle auswählen, bis das Level erreicht ist, ohne dass andere Bedingungen das Ergebnis einschränken. Für Stufe <=3 wird dies für jedes dieser Ergebnisse erneut durchgeführt.

Also für 3 Datensätze:

  • Level 1:3 Rekord (alle mit Level 1)
  • Ebene 2:3 Datensätze mit Ebene 1 + 3*3 Datensätze mit Ebene 2 =12
  • Stufe 3:3 + 3*3 + 3*3*3 =39 (tatsächlich jeweils 13 Datensätze).
  • Level 4:Fangen Sie an, ein Muster zu erkennen? :)

Es ist nicht wirklich ein Cross Join. Ein Cross-Join würde nur die Datensätze zurückgeben, die in diesem Abfrageergebnis Ebene 2 haben, während Sie mit diesem Connect by sowohl die Datensätze mit Ebene 1 als auch die Datensätze mit Ebene 2 erhalten, was zu 3 + 3 * 3 statt nur führt 3*3-Aufzeichnung.