samozłaczenie postgres 8.3

0

Na tabeli

idwypozyczenia | idplyty | idklienta | datawypozyczenia | oplataza1dzien | datazwrotu
----------------+---------+-----------+------------------+----------------+------------
1 | 7 | 1 | 2006-01-17 | 10 | 2006-11-19
2 | 8 | 2 | 2006-11-17 | 10 |
3 | 1 | 1 | 2006-11-17 | 4 | 2006-11-20
4 | 2 | 1 | 2007-02-26 | 4 |
5 | 1 | 2 | 2007-02-26 | 4 | 2007-03-01
6 | 3 | 2 | 2007-03-01 | 4 | 2007-03-01
7 | 5 | 2 | 2007-03-01 | 10 |
8 | 7 | 2 | 2007-03-01 | 4 |
9 | 4 | 1 | 2007-03-01 | 10 |
(9 rows)
wykonuje samozlaczenie w celu uzyskania idKienta posiadających płyte o idPlyty równym 7 i 8
zapytanie:

SELECT T1.idKlienta FROM Wypozyczenia T1 INNER JOIN  Wypozyczenia T2 ON T1.idKlienta=T2.idKlienta  WHERE  T1.idplyty=8 AND T2.idplyty=7;
 idklienta
-----------
         2
(1 row)

W wyniku brakuje jednego rekordu. Jak widać płyte o idPlyty=7 posiada klient o idKlienta=1 a zapytanie zwróciło tylko jeden rekord.

Jak sie robi te samozłaczenia. To zapytanie przepisałem z ksiażki wiec musi być dobrze, może coś w posgres 8 zmieniono?

0

Powyższe zapytanie zwraca klientów, którzy wypożyczyli zarówno płytę 8 jak i płytę 7. Klient 1 wypożyczył jedynie płytę 7 ale nie wypożyczył płyty 8, więc zapytanie jego nie zwróci. Złączenie dwóch tych samych tabel stosuje się m.in. wtedy gdy chcesz aby rekord spełniał oba warunki jednocześnie. Zauważ, że zapytanie na jednej tabeli z takimi samymi warunkami nie zwróci żadnego rekordu:

select
 idklienta
from
 wypozyczenia
where
 idplyty = 8 and idplyty = 7

  idklienta
-----------

(0 row(s) affected)

Dlatego właśnie w tym zapytaniu z książki jest złączenie dwóch tych samych tabel.

Jeżeli chcesz dostać osoby, które wypożyczyły płytę 8 albo płytę 7 to zapytanie powinno wyglądać następująco:

select
 idklienta
from
 wypozyczenia
where
 idplyty = 8 or idplyty = 7
group by idklienta

  idklienta
-----------
          1
          2

(2 row(s) affected)

W powyższym przypadku zapytanie zwróci dwóch klientów zarówno 1 jak i 2, ponieważ każdy z nich wypożyczył płytę 7 lub 8. Group by jest dlatego, że klient 2 wypożyczył obie płyty i grupowanie zapobiega dublowaniu tego rekordu.

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