Cardinalidad: cuando el join multiplica filas
IntermedioLa cardinalidad de un join dice cuántas filas de un lado corresponden a cada fila del otro. En una relación uno a muchos, cada fila del lado «uno» se repite tantas veces como parejas tenga, y cualquier suma sobre sus columnas queda inflada.
Ejemplo
SELECT
count(*) AS filas_tras_el_join,
count(DISTINCT o.id) AS pedidos_distintos,
sum(o.total_amount) AS suma_inflada
FROM orders AS o
INNER JOIN payments AS p ON p.order_id = o.id
WHERE o.currency = 'UYU'
AND o.created_at >= '2025-08-01'
AND o.created_at < '2025-09-01';Resultado
| filas_tras_el_join | pedidos_distintos | suma_inflada |
|---|---|---|
| 44 | 41 | 488618.75 |
Cómo leerlo
Hay 41 pedidos, pero 44 filas: tres pedidos tienen dos intentos de pago y aparecen dos veces. Por eso suma_inflada da 488618.75 cuando la suma real de esos 41 pedidos es 467268.26. Comparar count(*) con count(DISTINCT clave) es la forma más rápida de detectar el problema.
Error común
Sumar una columna del lado «uno» después de unir con el lado «muchos». La solución es llevar la tabla hija al grano de la tabla padre antes de unir (agregar payments por order_id en una CTE) o, si solo importa la existencia del pago, usar EXISTS en vez de un join.