SQL - left join

0

Mam tabele klienci i tabele faktury

select nazwisko
from klienci LEFT join faktury
on faktury.idklienta=klienci.idklienta
where nrfaktury is null;

instrukcja wyzej wyszukuje klientow bez faktury, nie rozumiem tego, co tu się dzieje, i
dalczego nie działa zwykłe join?
4p.jpg

3

Gdybyś użył zwykłego samego joina (oznaczająceg defacto INNER JOIN) otrzymałbyś tylko klientów którzy mają przynajmniej jedną fakturę. LEFT JOIN powoduje zwrócenie wszystkich klientów tzn tych którzy mają fakturę oraz tych którzy faktury nie mają , wtedy mają oni NULL zamiast pól kóre odpowiadałyby danym z faktury. W pytaniu chodzi o to żeby zwrócić klientów którzy nie mają faktury więc tych dla których pola odpowiadające fakturze są NULL - stąd taki warunek w WHERE. Nie możesz użyć po prostu JOIN bo wtedy nie zwróci ci żadnego klienta bez faktury.

0

takie polecenie

select klienci.nazwisko
from faktury RIGHT join klienci
on faktury.idklienta=klienci.idklienta
where nrfaktury is null; 

też działa, czyli tym jonowanym ma być tam, gdzie jest pusta wartość?

2

Zwróć uwagę ze w pierwszym zapytaniu jest left join, a w drugim right join, ale tabele są odwrotnie czyli to jest to samo zapytanie napisane w inny sposób.
Poczytaj o inner/left/right/cross joinach.

1

Poczytaj o joinach czym się różnią między sobą i poprubój bo inaczej będziesz strzelał w próżnię. Inner join albo sam join łączy tylko wpisy które mają id wpisu w drugiej tabeli.
Left bierze wszystko z pierwszej tabeli niezależnie czy ma wpis odpowiadający w drugiej tabeli. Right odwrotnie bierze wszystko z drugiej tabeli bez względu na to czy ma odpowiedniki w pierwszej tabeli.

OFC to co napisałam jest zagmatwane, dlatego poczytaj i popróbuj a sam zobaczysz różnicę między joinami.

0

dziękuje

0

W zasadzie to JOIN też by przeszło, gdyby użyć podzapytania z kwarendą NOT EXISTS. Dobrze myślę?

1
Błękitny Pomidor napisał(a):

W zasadzie to JOIN też by przeszło, gdyby użyć podzapytania z kwarendą NOT EXISTS. Dobrze myślę?

Nie, jeżeli użyłbyś not exists w where to wtedy musiałbyś mieć zapytanie bez joina z tabelą z fakturami.

Select * from klienci where nrklienta not exists in (select nrklienta from faktury)
0

Dobrą praktyka jest unikanie negacji w warunkach where. Takie zapytanie nie są optymalizowane przez silnik (w dużym skrócie)

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