Contenido de esta guía
Qué significa
CROSS JOIN genera el producto cartesiano de dos conjuntos: combina cada fila de la tabla izquierda con cada fila de la tabla derecha. Si una tabla aporta 2 filas y la otra 3, el resultado contiene 6 combinaciones.
Cuándo resulta útil
Se utiliza cuando necesitas todas las combinaciones posibles: por ejemplo, preparar una cuadrícula de productos y periodos, generar opciones de talla y color o construir un conjunto de escenarios para una comprobación. Debe ser una decisión explícita. En consultas habituales, un producto cartesiano accidental suele indicar que falta una condición de unión.
Regla rápida: antes de ejecutar, multiplica las filas de ambos lados. Esa cuenta te permite anticipar el tamaño del resultado.
Sintaxis básica
SELECT columnas
FROM tabla_a
CROSS JOIN tabla_b;CROSS JOIN no necesita una condición ON: precisamente pide todas las combinaciones. Puedes filtrar después con WHERE, aunque conviene reducir los datos antes cuando las tablas son grandes.
Ejemplo guiado
| id | nombre |
|---|---|
| 1 | Ana Torres |
| 2 | Luis Martín |
| id | nombre |
|---|---|
| 1 | Ratón |
| 2 | Teclado |
Queremos preparar una propuesta que combine cada uno de esos clientes con cada producto:
SELECT c.nombre AS cliente,
p.nombre AS producto
FROM clientes AS c
CROSS JOIN productos AS p
WHERE c.id IN (1, 2)
AND p.id IN (1, 2)
ORDER BY c.id, p.id;| cliente | producto |
|---|---|
| Ana Torres | Ratón |
| Ana Torres | Teclado |
| Luis Martín | Ratón |
| Luis Martín | Teclado |
Cómo leer el resultado
- La primera fila de
clientesse combina con las dos filas deproductos. - La segunda fila de
clientesvuelve a combinarse con esos dos productos. - El
WHERElimita el ejemplo a dos clientes y dos productos. ORDER BYsolo organiza la salida; no cambia las combinaciones creadas.
Error frecuente
Crear un producto cartesiano sin querer
SELECT c.nombre, p.id
FROM clientes AS c, pedidos AS p;La coma entre tablas sin una condición puede combinar cada cliente con cada pedido. Si buscabas relacionarlos mediante cliente_id, utiliza un JOIN ... ON. Reserva CROSS JOIN para los casos en los que todas las combinaciones son realmente el objetivo.
Comprueba lo aprendido
Genera una cuadrícula pequeña
Combina las categorías con id 1 y 2 con los productos con id 1 y 2. Devuelve categoria y producto, y ordena por los identificadores de ambas tablas.
Solución razonada
SELECT c.nombre AS categoria,
p.nombre AS producto
FROM categorias AS c
CROSS JOIN productos AS p
WHERE c.id IN (1, 2)
AND p.id IN (1, 2)
ORDER BY c.id, p.id;La consulta crea cuatro combinaciones. El filtro mantiene el ejercicio pequeño; en una consulta real conviene estimar el tamaño antes de ejecutar.
Compatibilidad y rendimiento
CROSS JOIN está ampliamente soportado. La idea del producto cartesiano es común, pero algunos motores aplican reglas particulares de optimización. En SQLite, por ejemplo, escribir explícitamente CROSS JOIN también puede limitar la reordenación de tablas por el optimizador. No uses ese detalle como técnica de rendimiento sin medir y consultar la documentación del motor.
Qué debes recordar
- Combina cada fila de un lado con todas las del otro.
- El número de filas crece como una multiplicación.
- Si no querías todas las combinaciones, probablemente falta una condición
ON.
Conceptos relacionados
Fuentes técnicas consultadas
Se utilizaron para comprobar la semántica y los matices entre motores. La explicación y los ejemplos son originales.