Oracle
 sql >> Database >  >> RDS >> Oracle

Perché CONNECT BY LEVEL su una tabella restituisce righe extra?

Nella prima query, ti connetti solo per il livello. Quindi, se livello <=1, ottieni ciascuno dei record 1 volta. Se livello <=2, allora ottieni ogni livello 1 volta (per il livello 1) + N volte (dove N è il numero di record nella tabella). È come se ti unissi in modo incrociato, perché stai semplicemente raccogliendo tutti i record dalla tabella fino al raggiungimento del livello, senza avere altre condizioni per limitare il risultato. Per il livello <=3, questo viene ripetuto per ciascuno di questi risultati.

Quindi per 3 record:

  • Record di livello 1:3 (tutti di livello 1)
  • Livello 2:3 record di livello 1 + 3*3 record di livello 2 =12
  • Livello 3:3 + 3*3 + 3*3*3 =39 (anzi, 13 record ciascuno).
  • Lvl 4:inizi a vedere uno schema? :)

Non è davvero un cross join. Un cross join restituirebbe solo quei record che hanno il livello 2 in questo risultato della query, mentre con questo collegamento si ottengono i record di livello 1 così come i record di livello 2, risultando così 3 + 3*3 invece di solo Registrazione 3*3.