Cum funcționează
Enunțul se contrazice — și asta e observația care se punctează
Cerința a) șterge comenzile anulate. Cerința b) cere numărul comenzilor anulate. Executate în ordinea
din subiect, a doua întoarce zero rânduri: nu mai există ce să numeri.
Nu e o eroare de citire, e o inconsecvență a subiectului oficial. Sunt trei reacții posibile, dintre
care doar una e bună:
- Rulezi în ordinea din enunț și b) iese gol. Tehnic „corect", practic un răspuns inutil.
- Scrii b) fără să observi că a) i-a tăiat datele — cel mai frecvent, pentru că fiecare cerință
pare corectă privită separat.
- Inversezi ordinea de execuție și explici de ce — numeri cât încă ai ce număra, apoi ștergi.
A treia variantă e cea scrisă mai sus. Comentariul din cod nu e decorativ: arată corectorului că
inversiunea e deliberată.
Aceeași situație apare la orice subiect care combină DELETE cu o statistică pe rândurile șterse. Un
DELETE nu se poate anula — datele nu mai există. De aceea, într-o bază reală, ștergerea se
înlocuiește cu o coloană anulata (0/1) sau se face o copie înainte:
INSERT INTO Comenzi_anulate SELECT * FROM Comenzi WHERE status = 'ANULATA';
DELETE FROM Comenzi WHERE status = 'ANULATA';
DELETE — sintaxa și singura ei capcană
DELETE FROM Comenzi WHERE status = 'ANULATA';
Nu se scrie nicio coloană: DELETE șterge rânduri întregi, nu valori. Dacă voiai să golești doar
un câmp, aceea e o operație de UPDATE cu SET câmp = NULL.
Iar WHERE e, ca la UPDATE, singurul lucru care stă între tine și golirea tabelului:
DELETE FROM Comenzi; -- sterge TOATE comenzile. Fara confirmare, fara mesaj.
b) COUNT pe grupuri, după filtrare
Structura e cea de la problema #137:
WHERE păstrează doar comenzile anulate, GROUP BY r.nume le așează pe restaurante, COUNT numără
în fiecare grup. Restaurantele fără comenzi anulate nu apar — și aici e corect, pentru că se cer
restaurantele cu comenzi anulate. (Dacă s-ar cere „toate restaurantele, cu numărul de anulări", ar
trebui LEFT JOIN și condiția mutată în ON.)
Greșeli frecvente
- Executarea în ordinea din enunț fără să observi conflictul — b) iese gol și crezi că ai greșit
interogarea.
DELETE FROM Comenzi fără WHERE — tabelul se golește. Ireversibil.
DELETE valoare FROM Comenzi WHERE ... — DELETE nu ia coloane. Eroare de sintaxă.
WHERE status = 'Anulata' — în Oracle nu potrivește 'ANULATA'; zero rânduri șterse, și pare
că instrucțiunea n-a rulat.
COUNT(*) cu LEFT JOIN — restaurantele fără anulări ar apărea cu 1. Vezi
problema #128.
GROUP BY uitat — un singur număr total, nu câte unul pe restaurant.