Cum funcționează
MIN pe o coloană de tip dată
MIN pe o coloană date întoarce data cea mai veche, nu cea mai mică ca text. Distincția
contează: dacă data_inscriere fusese declarată varchar2 și datele scrise '15.03.2021', comparația
s-ar face alfabetic, iar '01.09.2024' ar ieși „mai mic" decât '15.03.2021'. Tipul date e ceea ce
face MIN să însemne „cel mai devreme".
b) Enunțul spune explicit „sau jucătorilor”
Formularea „jucătorului (sau jucătorilor) înscris(și)" e recunoașterea, în enunț, că mai mulți jucători
se pot fi înscris în aceeași zi. Deci răspunsul trebuie să-i întoarcă pe toți — ce face subinterogarea
cu MIN, și ce nu face ORDER BY data_inscriere + primul rând.
Tiparul e cel de la problema #127,
cu MIN în loc de MAX. Varianta pe date, cu MAX („cel mai recent"), e la
problema #145.
De ce LEFT JOIN și aici
Cel mai vechi jucător înscris ar putea să nu aibă niciun joc înregistrat. Cu INNER JOIN, răspunsul la
b) ar fi gol — deși la a) ai o dată perfect validă. Cu LEFT JOIN, username-ul apare, iar coloana
denumire rămâne goală: un răspuns care spune „el e, dar nu are jocuri". Aceeași logică, explicată pe
larg, la problema #154.
Am adăugat j.data_inscriere în SELECT: fără ea, rezultatul e un username fără nicio dovadă că e
chiar cel mai vechi.
Greșeli frecvente
ORDER BY data_inscriere + primul rând — enunțul cere explicit „sau jucătorilor"; pierzi
egalitățile.
MAX în loc de MIN — „cel mai devreme" e data cea mai mică. Formularea „primul înscris" sună
ca un maxim al vechimii, de aici confuzia.
WHERE j.data_inscriere = MIN(j.data_inscriere) — agregările nu se pot folosi în WHERE.
SELECT j.username, MIN(j.data_inscriere) fără GROUP BY — eroare în Oracle, username arbitrar
în MySQL/SQLite.
INNER JOIN — dacă primul jucător înscris nu are jocuri, răspunsul la b) e gol, fără explicație.
- Comparație cu o dată scrisă de mână (
= '2021-03-15') — ai citit răspunsul din date; se strică
la prima înscriere nouă.