Join na kilku tabelach generuje produkt kartezjanski

0

Witam

Mam 4 tabele, Parent(1), Child1(2), Child2(1), Child3(3). W nawiasach liczba rekordów.
Wszystkie tabele Childx posiadają relację do Parent.

Poniższe zapytanie tworzy produkt karteznański i zwróci 6 rekordów.

select *
from 
   PARENT parent0_, CHILD1 child1s1_, CHILD2 child2s2_, CHILD3 child3s3_;

Nie rozumiem dlaczego poniższe zapytanie pomimo dodanych joinów zwraca identyczny wynik:

select *
from 
   PARENT parent0_ 
   left outer join CHILD1 child1s1_ on parent0_.id=child1s1_.parent_id 
   left outer join CHILD2 child2s2_ on parent0_.id=child2s2_.parent_id 
   left outer join CHILD3 child3s3_ on parent0_.id=child3s3_.parent_id 
 
0

o_O ale przecież pierwsze zapytanie też używa joinów, tylko że inner joinów a nie żadnego produktu kartezjańskiego. A zwraca to samo bo zakładam że nigdzie nie ma parent=null, a że zlączenia idą po polu parent to outer i inner join zadziałają identycznie.

0

Nie rozumiem. Z tego co przeczytałem to własnie zapis jaki zastosowałem w pierwszym przypadku tworzy produkt kartezjański bo jego wynikiem są wszystkie możliwe kombinacje i taki też dostaję.

Bardziej nie rozumiem dlaczego drugie zapytanie zwraca mi 6 rekordów skoro parent posiada w sumie relację do 5 dzieci.

0

Widzisz, jak chcesz to umiesz zadać sensowne pytanie:
Dzieje się tak dlatego że dokonujesz złączania w pewnej kolejności, tzn:
Pierwszy join generuje ci 2 wiersze w wyniku wykonania zapytania
Parent Child1(1)
Parent Child1(2)
Kolejny join dodaje do nich swoje wiersze (dołączone na bazie klucza do parenta, więc zauważ że dołączenie następuje do OBU wierszy!)
Parent Child1(1) Child2(1)
Parent Child1(2) Child2(1)
Ostatni join dołącza każdy ze swoich rekordów do już istniejacych rekordów (bo łączy po kluczu parenta, więc dołącz do już istniejących wierszy każdy swój wiersz gdzie pasuje warunek na parenta)
Parent Child1(1) Child2(1) Child3(1)
Parent Child1(1) Child2(1) Child3(2)
Parent Child1(1) Child2(1) Child3(3)
Parent Child1(2) Child2(1) Child3(1)
Parent Child1(2) Child2(1) Child3(2)
Parent Child1(2) Child2(1) Child3(3)

1 użytkowników online, w tym zalogowanych: 0, gości: 1