English

Manual de campo · trampas de SQL

El join que multiplica filas

Agregar después de un JOIN uno-a-muchos duplica cada fila del lado «uno» tantas veces como filas tenga enfrente, y toda suma posterior sale inflada.

Cuándo aparece

Siempre que agregues (sum, count, avg) después de unir dos tablas. Es el error que produce informes con números creíbles y falsos: nadie los revisa porque parecen razonables.

Ejemplo

Mal: se suma después de unir

SELECT p.cliente_id,
       sum(p.importe) AS facturado,
       count(l.id)    AS lineas
FROM pedidos p
JOIN lineas l ON l.pedido_id = p.id
GROUP BY p.cliente_id;
-- p.importe se repite una vez por cada línea del pedido:
-- un pedido de 100 con 3 líneas suma 300

Bien: se agrega primero, se une después

SELECT p.cliente_id,
       sum(p.importe) AS facturado,
       sum(l.n)       AS lineas
FROM pedidos p
JOIN (
  SELECT pedido_id, count(*) AS n
  FROM lineas
  GROUP BY pedido_id
) l ON l.pedido_id = p.id
GROUP BY p.cliente_id;

La pregunta que hay que hacerse después de escribir cualquier JOIN es «¿cuántas filas espero que salgan?». Compara el conteo antes y después: SELECT count(*) FROM pedidos contra SELECT count(*) FROM pedidos JOIN lineas ON …. Si el segundo número es mayor, el lado derecho tiene varias filas por clave y cualquier sum() o avg() posterior queda inflado exactamente en esa proporción. La forma robusta es agregar la tabla que fan-outea en una subconsulta o CTE propio, y unir ya agregada.

Esta trampa —y otras cuatro más— están escondidas en un caso de verdad, con datos de verdad.

Jugar el caso 1 gratis →

Otras trampas