SQL
ERROR 1242 (21000): Subquery returns more than 1 row – MySQL 1242
L'errore MySQL 1242 si verifica quando una sottoquery usata in un contesto scalare, come un confronto con = o un valore di SELECT, restituisce più righe. La query esterna si aspetta un solo valore ma la condizione non garantisce l'unicità. La correzione consiste nel rendere unico il filtro, usare una funzione aggregata oppure cambiare il confronto in IN o ANY quando più righe sono corrette.
Cosa significa questo errore?
L'errore MySQL 1242 si verifica quando una sottoquery usata in un contesto scalare, come un confronto con = o un valore di SELECT, restituisce più righe. La query esterna si aspetta un solo valore ma la condizione non garantisce l'unicità. La correzione consiste nel rendere unico il filtro, usare una funzione aggregata oppure cambiare il confronto in IN o ANY quando più righe sono corrette.
Messaggio originale
ERROR 1242 (21000): Subquery returns more than 1 rowContesto e parole chiave
Alias
- ER_SUBSELECT_NO_1_ROW
- Scalar subquery returned multiple rows
- SQLSTATE 21000
Messaggi alternativi
- La sottoquery restituisce più di una riga
- Risultato non scalare
Prodotti
- MySQL / MariaDB Server
Piattaforme
- Linux
- macOS
- Windows Server
Parole chiave
- mysql errore 1242
- mysql scalar subquery
- subquery returns more than 1 row
Cause possibili
La sottoquery restituisce più righe
Il filtro interno trova più record mentre l'operatore esterno richiede un singolo valore.
molto comuneUso di = al posto di IN o ANY
La relazione reale è uno-a-molti ma la query è stata scritta con un confronto scalare.
comuneDiagnosi
Numero di righe prodotte dalla sottoquery
Eseguire la sottoquery separatamente con COUNT o visualizzando le chiavi.
Come leggere il risultato. Un conteggio maggiore di uno conferma che il contesto scalare non è appropriato.
SELECT COUNT(*) FROM (SELECT ... ) AS risultati;Vincoli di unicità del modello
Verificare se il filtro dovrebbe identificare una sola riga o una collezione.
Come leggere il risultato. Un indice UNIQUE o un filtro più preciso può rendere il risultato realmente scalare.
SHOW CREATE TABLE tabella;Risoluzione
Rendere univoco il filtro
Aggiungere le condizioni necessarie quando il modello dati prevede una sola riga.
- Elencare le righe restituite dalla sottoquery.
- Individuare il criterio mancante.
- Aggiungere il filtro o il vincolo di unicità.
- Testare sia il caso atteso sia il caso con duplicati.
Usare IN, ANY o un'aggregazione
Adattare l'operatore al fatto che più righe siano un risultato valido.
- Sostituire = con IN o ANY quando occorre confrontare una lista.
- Usare MAX, MIN o COUNT solo se la regola funzionale lo giustifica.
- Verificare il risultato con dati rappresentativi.
Domande frequenti
LIMIT 1 è sempre una soluzione corretta al 1242?
No. LIMIT 1 nasconde le righe aggiuntive e può scegliere un record arbitrario; va usato solo se la regola applicativa definisce quale riga sia valida e con un ORDER BY coerente.
Approfondimenti
- Subquery Errors - MySQL Reference Manual manuale_ufficiale