sql >> Databáze >  >> RDS >> Oracle

Proč CONNECT BY LEVEL v tabulce vrací řádky navíc?

V prvním dotazu se připojíte pouze podle úrovně. Pokud tedy úroveň <=1, dostanete každý ze záznamů jednou. Pokud úroveň <=2, pak každou úroveň získáte 1krát (pro úroveň 1) + Nkrát (kde N je počet záznamů v tabulce). Je to jako byste se křížili, protože pouze vybíráte všechny záznamy z tabulky, dokud není dosaženo úrovně, aniž byste měli další podmínky pro omezení výsledku. Pro úroveň <=3 se to provede znovu pro každý z těchto výsledků.

Takže pro 3 záznamy:

  • Záznam Lvl 1:3 (všechny mají úroveň 1)
  • Lvl 2:3 záznamy s úrovní 1 + 3*3 záznamy s úrovní 2 =12
  • Lvl 3:3 + 3*3 + 3*3*3 =39 (skutečně 13 záznamů každý).
  • Lvl 4:Začínáte vidět vzorec? :)

Ve skutečnosti to není křížový spoj. Křížové spojení by vrátilo pouze ty záznamy, které mají v tomto výsledku dotazu úroveň 2, zatímco s tímto připojením získáte záznamy s úrovní 1 a také záznamy s úrovní 2, což má za následek 3 + 3*3 namísto pouhého Záznam 3*3.



  1. Jak drahé jsou implicitní konverze na straně sloupců?

  2. Používání relačních databází MySQL na Gentoo

  3. SQLite Přejmenovat sloupec

  4. PL/SQL vytiskne referenční kurzor vrácený uloženou procedurou