MetricSign
Start free
Medium severityquery

MySQL Error:
1242

What does this error mean?

MySQL Error 1242 wordt gegooid wanneer een scalaire subquery — een subquery die op één waarde wordt vergeleken met `=`, `<`, `>` of `<>` — meer dan één rij teruggeeft. MySQL verwacht in dat context precies één waarde; zodra de subquery twee of meer rijen produceert, stopt de query met een fout. In een data-pipeline betekent dit dat een ADF Lookup-activiteit, een dbt model, of een stored procedure crasht zodra de data groeide of de filter niet meer uniek is. De engineer ziet de fout pas tijdens uitvoering, niet tijdens het schrijven van de query.

Common causes

  • 1Gebruik van `=` in plaats van `IN` bij een subquery die meerdere rijen kan teruggeven: `WHERE customer_id = (SELECT id FROM customers WHERE country = 'NL')` faalt zodra er meer dan één klant in Nederland zit.
  • 2Een subquery die draait op een kolom zonder UNIQUE-constraint: de developer gaat ervan uit dat de waarde uniek is, maar de tabel heeft duplicaten door een laad-bug of een ontbrekende unieke index.
  • 3Een correlated subquery in een dbt model die bij kleine datasets werkte maar breekt wanneer de brondata groeit: het aantal overeenkomende rijen stijgt van één naar meerdere na een historische backfill.
  • 4Een ADF Copy of Lookup-activiteit met een custom SQL-query waarbij de subquery gefilterd was op een datum die inmiddels meerdere records dekt — bijv. `WHERE run_date = (SELECT MAX(run_date) FROM audit_log WHERE status = 'ok')` terwijl meerdere runs op dezelfde dag als 'ok' zijn gemarkeerd.
  • 5Een `NOT IN (subquery)` of `= ANY (subquery)` constructie waarbij de subquery onbedoeld meerdere waarden teruggeeft omdat een join in de subquery fan-out veroorzaakte.
  • 6Een stored procedure of trigger die een variabele vult via `SELECT @var = (SELECT ...)` — zodra de innerlijke SELECT meer dan één rij geeft, gooit MySQL 1242 in strict mode.
  • 7Een subquery die gefilterd was op een foreign key maar de referentiële integriteit niet afgedwongen werd: na een bulk import zitten er dubbele waarden in de kolom waarop gefilterd wordt.

How to fix it

  1. 1Stap 1 — Vervang `=` door `IN` voor multi-rij subqueries: `WHERE customer_id IN (SELECT id FROM customers WHERE country = 'NL')`. Dit is de correcte oplossing wanneer de logica 'één van meerdere mogelijke waarden' bedoelt.
  2. 2Stap 2 — Gebruik een aggregatiefunctie als de bedoeling werkelijk één waarde is: `WHERE run_id = (SELECT MAX(run_id) FROM audit_log WHERE status = 'ok')`. Kies MAX, MIN, of een andere aggregatie die past bij de bedrijfslogica.
  3. 3Stap 3 — Voeg LIMIT 1 toe als volgorde bepaalt welke rij je wilt: `WHERE customer_id = (SELECT id FROM customers WHERE country = 'NL' ORDER BY created_at DESC LIMIT 1)`. Let op: dit verbergt het duplicaten-probleem in plaats van het op te lossen.
  4. 4Stap 4 — Diagnose hoeveel rijen de subquery teruggeeft door hem los uit te voeren: `SELECT id FROM customers WHERE country = 'NL';` — tel de rijen en besluit dan of aggregatie of IN de juiste fix is.
  5. 5Stap 5 — Controleer of de bronkolom een UNIQUE index heeft: `SHOW INDEX FROM customers WHERE Column_name = 'id';` — ontbreekt de UNIQUE constraint, overweeg die toe te voegen als de kolom bedoeld uniek is.
  6. 6Stap 6 — In ADF: open de Lookup-activiteit → Source → Query, pas de SQL aan met IN of MAX/MIN, en test de activiteit via Debug run voordat je de pipeline publiceert.
  7. 7Stap 7 — In dbt: zoek het model op met `grep -r 'SELECT.*FROM.*WHERE.*=' models/` om correlated subqueries te vinden, fix de query, en run `dbt compile && dbt run --select <model>` om de fix te verifiëren.

Example log output

ERROR 1242 (21000): Subquery returns more than 1 row
[ADF] Activity 'LookupLatestRun' failed: MySqlException: Subquery returns more than 1 row. (Activity ID: 3f8a2c1d-...)
[dbt] Database Error in model stg_orders (models/staging/stg_orders.sql): Subquery returns more than 1 row

Frequently asked questions

Hoe fix ik MySQL error 1242?

De snelste fix is `=` vervangen door `IN`: `WHERE id IN (SELECT id FROM tabel WHERE conditie)`. Als je zeker weet dat je de hoogste of laagste waarde wilt, gebruik dan `= (SELECT MAX(kolom) FROM ...)`. Controleer altijd eerst hoeveel rijen de subquery los teruggeeft.

Waarom werkte de query gisteren wel en nu niet?

De brondata is gegroeid: de subquery gaf gisteren één rij terug omdat er maar één record aan de conditie voldeed, maar vandaag zijn er meerdere. Dit is een veelvoorkomend patroon na een data-import, backfill, of wanneer een datum-filter meerdere records dekt (bijv. twee runs op dezelfde dag).

Kan ik LIMIT 1 gebruiken als snelle fix?

Technisch gezien lost LIMIT 1 de fout op, maar het verbergt het onderliggende probleem: je pikt willekeurig één rij uit meerdere mogelijke rijen, wat tot incorrecte resultaten kan leiden. Gebruik LIMIT 1 alleen als de volgorde via ORDER BY bepaalt welke rij bedoeld is, en documenteer waarom.

Hoe voorkom ik dat MySQL 1242 opnieuw optreedt in een pipeline?

Voeg een UNIQUE-constraint toe op de kolom waarop de subquery filtert als die semantisch uniek hoort te zijn. Schrijf in dbt een test (`unique` test op de bronkolom) zodat de pipeline faalt bij het laden van duplicaten in plaats van bij het bevragen ervan. In ADF kun je een validatie-activiteit toevoegen die de rij-count controleert vóór de Lookup.

Source · dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html

Other query errors