SQL CROSS JOIN: todas las combinaciones de filas
Lección 5.6 · Tiempo de lectura: ~5 min · Tareas de práctica ↓
SQL CROSS JOIN combina cada fila de una tabla con cada fila de otra; el resultado se llama producto cartesiano. En esta lección aprenderás la sintaxis de CROSS JOIN, qué tan grande es su resultado y cómo usarlo para armar grillas de informes que muestran ceros en lugar de filas faltantes.
Todos los joins vistos hasta ahora emparejaban filas según una condición. CROSS JOIN no tiene condición: cada fila de la primera tabla se encuentra con cada fila de la segunda. Pocas veces es lo que quieres con datos relacionados, pero es justo lo que necesitas para generar todas las combinaciones: cada tienda con cada categoría, cada producto con cada talle, cada día con cada empleado.
Qué devuelve CROSS JOIN
Si la primera tabla tiene m filas y la segunda n filas, el resultado tiene m × n filas. No hay cláusula ON.
Sintaxis básica
SELECT table1.column1, table2.column2
FROM table1
CROSS JOIN table2;
La sintaxis antigua con coma, FROM table1, table2 sin condición, significa lo mismo. CROSS JOIN expresa la intención de forma explícita y es la preferida.
Ejemplo: cada tienda con cada categoría
SELECT s.store_id, c.name AS category
FROM store AS s
CROSS JOIN category AS c
ORDER BY s.store_id, c.name;
Resultado: 32 filas: 2 tiendas × 16 categorías, cada tienda con cada categoría.
Armar una grilla de informe
El uso más práctico de CROSS JOIN es el "esqueleto" de un informe. Supón que necesitas la cantidad de películas por tienda y categoría, incluidas las combinaciones sin ninguna película. Un join normal con GROUP BY devuelve solo las combinaciones que existen en los datos. Un CROSS JOIN crea primero todas las combinaciones, y luego un LEFT JOIN les agrega los datos:
SELECT s.store_id,
c.name AS category,
COUNT(i.inventory_id) AS copies
FROM store AS s
CROSS JOIN category AS c
LEFT JOIN film_category AS fc ON fc.category_id = c.category_id
LEFT JOIN inventory AS i ON i.film_id = fc.film_id
AND i.store_id = s.store_id
GROUP BY s.store_id, c.name
ORDER BY s.store_id, c.name;
Resultado: 32 filas con la cantidad de copias de películas de cada categoría en cada tienda. Una combinación sin copias mostraría 0 en lugar de desaparecer.
COUNT(i.inventory_id) cuenta solo las copias encontradas, así que una combinación sin copias obtiene 0. La misma técnica completa los huecos en series temporales: un cross join entre una lista de fechas y una lista de productos da una fila para cada producto en cada día.
El producto cartesiano accidental
Un producto cartesiano aparece a menudo por error, cuando falta una condición de unión:
-- Sin condición de unión: cada actor se combina con cada película
SELECT COUNT(*) AS row_count
FROM actor, film;
Resultado: 200 000 filas: 200 actores × 1000 películas.
Si una consulta de pronto devuelve demasiadas filas, o las filas se repiten en combinaciones raras, revisa que cada tabla unida tenga una condición de unión. Dos tablas de 100 000 filas cada una producen 10 000 millones de combinaciones, lo que puede detener la base de datos.
Conclusiones clave:
CROSS JOINcombina cada fila de una tabla con cada fila de otra.- El resultado tiene
m × nfilas y no hay condiciónON. FROM a, bsin condición también es un producto cartesiano, a menudo accidental.CROSS JOINmásLEFT JOINarma una grilla de informe completa, con ceros para las combinaciones faltantes.- Revisa el tamaño del resultado antes de hacer un cross join de tablas grandes.
Preguntas frecuentes
¿Qué es un producto cartesiano en SQL?
El conjunto de todas las combinaciones de filas de dos tablas. Si una tabla tiene 2 filas y la otra 16, el producto cartesiano tiene 32 filas. CROSS JOIN lo devuelve de forma explícita.
¿Cuál es la diferencia entre CROSS JOIN e INNER JOIN?
INNER JOIN conserva solo las combinaciones que cumplen la condición ON. CROSS JOIN conserva todas las combinaciones. Un INNER JOIN con una condición siempre verdadera se comporta como un CROSS JOIN.
¿Cuándo conviene usar CROSS JOIN?
Cuando necesitas todas las combinaciones: grillas de informes, variantes de productos (colores × talles), calendarios (fechas × empleados) o para completar huecos en series temporales junto con LEFT JOIN.