ERROR 1242 (21000): Subquery returns more than 1 row – MySQL 1242

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 row

Contesto 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 comune

Uso di = al posto di IN o ANY

La relazione reale è uno-a-molti ma la query è stata scritta con un confronto scalare.

comune

Diagnosi

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.

mysql
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.

mysql
SHOW CREATE TABLE tabella;

Risoluzione

Rendere univoco il filtro

Difficoltà: mediaRischio: medio

Aggiungere le condizioni necessarie quando il modello dati prevede una sola riga.

  1. Elencare le righe restituite dalla sottoquery.
  2. Individuare il criterio mancante.
  3. Aggiungere il filtro o il vincolo di unicità.
  4. Testare sia il caso atteso sia il caso con duplicati.

Usare IN, ANY o un'aggregazione

Difficoltà: facileRischio: basso

Adattare l'operatore al fatto che più righe siano un risultato valido.

  1. Sostituire = con IN o ANY quando occorre confrontare una lista.
  2. Usare MAX, MIN o COUNT solo se la regola funzionale lo giustifica.
  3. 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

Schede correlate