Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pourquoi CONNECT BY LEVEL sur une table renvoie-t-il des lignes supplémentaires ?

Dans la première requête, vous vous connectez uniquement par le niveau. Ainsi, si le niveau <=1, vous obtenez chacun des enregistrements 1 fois. Si niveau <=2, alors vous obtenez chaque niveau 1 fois (pour le niveau 1) + N fois (où N est le nombre d'enregistrements dans la table). C'est comme si vous faisiez une jointure croisée, car vous ne faites que sélectionner tous les enregistrements de la table jusqu'à ce que le niveau soit atteint, sans avoir d'autres conditions pour limiter le résultat. Pour le niveau <=3, ceci est refait pour chacun de ces résultats.

Donc pour 3 enregistrements :

  • Lvl 1 :3 record (tous ayant le niveau 1)
  • Niveau 2 :3 enregistrements de niveau 1 + 3*3 enregistrements de niveau 2 =12
  • Niveau 3 :3 + 3*3 + 3*3*3 =39 (en fait, 13 enregistrements chacun).
  • Niveau 4 :vous commencez à voir une régularité ? :)

Ce n'est pas vraiment une jointure croisée. Une jointure croisée ne renverrait que les enregistrements de niveau 2 dans ce résultat de requête, tandis qu'avec cette connexion, vous obtenez les enregistrements de niveau 1 ainsi que les enregistrements de niveau 2, ce qui donne 3 + 3 * 3 au lieu de simplement Enregistrement 3*3.