Cum funcționează
Aici egalitatea la maxim nu e teoretică
Un rating e o notă de la 1 la 5 cu o zecimală — adică 41 de valori posibile pentru zeci de
restaurante. Șansa ca două să aibă exact același rating maxim e foarte mare; în datele de test, două
restaurante au 4.8.
De aceea varianta „sortez descrescător și iau primul rând" pierde jumătate din răspuns exact
aici, unde e cel mai probabil. Subinterogarea cu MAX le întoarce pe amândouă. Tiparul complet e
explicat la problema #127.
rating number(2,1) — două cifre, una zecimală
Notația din enunț spune: în total două cifre, dintre care una după virgulă. Deci valori de la 0.0
la 9.9. Într-un câmp number(2) (fără zecimale), 4.8 s-ar rotunji la 5 — și toate
restaurantele ar avea brusc același rating.
Comparația rating = 4.8 scrisă direct funcționează aici, dar la numere zecimale stocate ca float
egalitatea exactă e nesigură. Încă un motiv să compari cu rezultatul lui MAX, nu cu o valoare
scrisă de mână.
b) Subinterogarea nu se schimbă
Ca la problema #134: MAX(rating) se
calculează pe Restaurante, indiferent că interogarea principală pleacă din Comenzi. Se cer doar
idc și valoare, deci doar ele intră în SELECT.
Varianta echivalentă, cu IN:
SELECT idc, valoare FROM Comenzi
WHERE idr IN (SELECT idr FROM Restaurante
WHERE rating = (SELECT MAX(rating) FROM Restaurante));
Două subinterogări una în alta. Corectă, dar mai greu de citit decât joncțiunea.
Greșeli frecvente
ORDER BY rating DESC + primul rând — la ratinguri, egalitatea pe maxim e regula, nu excepția.
SELECT nume, MAX(rating) — eroare în Oracle, nume arbitrar în MySQL/SQLite.
MAX(valoare) în loc de MAX(rating) — răspunzi la altă întrebare (aceea e
problema #134).
WHERE rating = 4.8 — ai citit maximul din date și l-ai scris de mână. Merge acum, se strică
la prima comandă nouă.
- Joncțiune uitată la b) —
rating nu există în Comenzi.
SELECT * la b) — s-au cerut două coloane.