Cum funcționează
Cele două cerințe trebuie să fie coerente între ele
Aici e subtilitatea problemei. Cerința a) afișează toți jucătorii din România — să zicem cinci.
Cerința b) afișează jucătorii din România și jocurile lor. Cu INNER JOIN, un jucător înscris care
n-a înregistrat încă niciun joc dispare: la a) apar cinci jucători, la b) doar patru.
Nu e o eroare de sintaxă, e o inconsecvență între două răspunsuri care ar trebui să vorbească despre
aceiași oameni. LEFT JOIN o rezolvă: jucătorul apare cu denumirea jocului NULL (afișată gol sau
ca „(null)", în funcție de program).
Pe datele de test există exact un astfel de jucător — înscris, din România, fără jocuri.
Care variantă e „corectă" depinde de cum citești enunțul:
| Interpretare |
Joncțiune |
| „jucătorii din România, cu jocurile lor (dacă au)" |
LEFT JOIN |
| „perechile jucător-joc, pentru jucătorii din România" |
INNER JOIN |
Amândouă se apără, dar LEFT JOIN nu pierde informație, iar coerența cu cerința a) e un argument
solid. Important e să observi diferența — un elev care scrie INNER JOIN fără să știe ce lasă pe
dinafară dă răspunsul corect din întâmplare.
WHERE pus pe tabelul din stânga
La LEFT JOIN, locul condiției contează:
LEFT JOIN Jocuri g ON j.idj = g.idj
WHERE j.tara = 'Romania' -- filtreaza JUCATORII: corect aici
Condiția e pe j.tara, adică pe tabelul păstrat integral — deci filtrează jucătorii înainte de
afișare și nu anulează efectul lui LEFT JOIN. Dacă în schimb pui în WHERE o condiție pe tabelul
din dreapta (ex. WHERE g.scor > 80), rândurile cu NULL cad, iar LEFT JOIN se comportă exact ca
INNER JOIN. Condițiile pe tabelul din dreapta se mută în ON.
„România” cu diacritic
În enunț: „România". În tabel, foarte probabil Romania. Comparația cu = e caracter cu caracter,
deci 'România' nu găsește Romania — zero rânduri, fără eroare. Vezi și
problema #132.
Greșeli frecvente
INNER JOIN la b) — pierzi jucătorii fără jocuri, deși la a) apar. Două răspunsuri care se
contrazic.
'România' cu â — zero rânduri, fără nicio eroare.
WHERE g.scor > 0 adăugat „pentru curățenie" — anulează LEFT JOIN, pentru că elimină
rândurile cu NULL.
WHERE tara = 'Romania' pus în ON la LEFT JOIN — atunci filtrarea se aplică doar joncțiunii,
iar jucătorii din alte țări rămân în rezultat, cu joc NULL.
SELECT * la b) — se cer două coloane.
- Joncțiune uitată —
denumire nu există în Jucatori.