Cum funcționează
„Comanda/comenzile” — pluralul din enunț e un indiciu
Enunțul scrie „comanda/comenzile", adică admite că pot fi mai multe cu aceeași valoare maximă.
Interogarea trebuie să le întoarcă pe toate. Construcția e cea explicată în detaliu la
problema #127:
- subinterogarea află cât e maximul:
(SELECT MAX(valoare) FROM Comenzi) → 320.00
- interogarea principală află care rânduri au exact atât
Ce nu funcționează, deși pare cel mai scurt drum:
SELECT idc, MAX(valoare) FROM Comenzi; -- GREȘIT
SELECT * FROM Comenzi ORDER BY valoare DESC; -- si se citeste primul rand
Prima dă eroare în Oracle și un idc la întâmplare în MySQL/SQLite. A doua nu e o interogare care
răspunde la întrebare, e o listă din care alegi cu ochii — și dacă două comenzi sunt la egalitate,
afișezi una din două.
b) Aceeași condiție, după joncțiune
Telefonul e în Restaurante, valoarea în Comenzi. Subinterogarea rămâne neschimbată: MAX se
calculează tot pe Comenzi, independent de joncțiune. E un detaliu care se greșește des —
subinterogarea nu „moștenește" nimic de la interogarea din jur; e o întrebare separată, la care se
răspunde o singură dată.
Am adăugat și c.valoare în SELECT, deși cerința nu o cere explicit: fără ea, rezultatul e un nume
și un telefon, fără nicio urmă de ce sunt acolo.
Greșeli frecvente
SELECT idc, MAX(valoare) — eroare în Oracle; în MySQL/SQLite afișează maximul lângă un idc
arbitrar. Rezultat credibil și greșit.
ORDER BY valoare DESC și primul rând — pierzi comenzile aflate la egalitate pe maxim.
WHERE valoare = MAX(valoare) — agregările nu se pot folosi direct în WHERE.
MAX calculat pe tabelul greșit — (SELECT MAX(valoare) FROM Restaurante): coloana nu există
acolo.
MAX(rating) în loc de MAX(valoare) — confuzie între cele două „maxime" din baza de date.
Ratingul maxim e cerut la problema #135.
SELECT * la cerința b) — s-au cerut numele și telefonul, nu toate cele 12 coloane.