38 - Combinación cruzada (cross join)

Vimos que hay tres tipos de combinaciones: 1) combinación interna (inner join), 2) combinación externa (left join) y 3) combinación cruzada.

La combinación cruzada (cross join) muestran todas las combinaciones de todos los registros de las tablas combinadas. Para este tipo de join no se incluye una condición de enlace. Se genera el producto cartesiano en el que el número de filas del resultado es igual al número de registros de la primera tabla multiplicado por el número de registros de la segunda tabla, es decir, si hay 5 registros en una tabla y 6 en la otra, retorna 30 filas.

La sintaxis básica es ésta:

 select CAMPOS
  from TABLA1
  cross join TABLA2;

Problema resuelto

Un pequeño restaurante tiene almacenados los nombres y precios de sus comidas en una tabla llamada "comidas" y en una tabla denominada "postres" los mismos datos de sus postres.

Eliminamos ambas tablas si existen:

 drop table if exists comidas;
 drop table if exists postres;

Creamos las tablas con las siguientes estructuras:

 create table comidas(
  codigo integer primary key,
  nombre text,
  precio real
 );

 create table postres(
  codigo integer primary key,
  nombre text,
  precio real
 );

Insertamos una serie de filas en cada tabla:

 insert into comidas values(1,'milanesa y fritas',3.4);
 insert into comidas values(2,'arroz primavera',2.5);
 insert into comidas values(3,'pollo',2.8);

 insert into postres values(1,'flan',1);
 insert into postres values(2,'porcion de torta',2.1);
 insert into postres values(3,'gelatina',0.9);

El restaurante quiere combinar los registros de ambas tablas para mostrar los distintos menúes que ofrece. Lo hacemos usando un "cross join":

  select c.nombre as platoprincipal,
         p.nombre as postre,
         c.precio+p.precio as total
   from comidas as c
   cross join postres as p;

Tenemos como resultado:

SQLite Browser cross join

Veamos un ejemplo. Un pequeño restaurante almacena los nombres y precios de sus comidas en una tabla llamada "comidas" y en una tabla denominada "postres" los mismos datos de sus postres.

Si necesitamos conocer todas las combinaciones posibles para un menú, cada comida con cada postre, empleamos un "cross join":

 select c.nombre as platoprincipal, p.nombre as postre
  from comidas as c
  cross join postres as p;

La salida muestra cada plato combinado con cada uno de los postres.

Como cualquier tipo de "join", puede emplearse una cláusula "where" que condicione la salida.

Problema propuesto

Una agencia matrimonial almacena la información de sus clientes de sexo femenino en una tabla llamada "mujeres" y en otra la de sus clientes de sexo masculino llamada "varones".

  1. Borrar las tablas "mujeres" y "varones" si existen.

  2. Crear las tablas "mujeres" y "varones" con las siguientes estructuras:

     create table mujeres(
      documento text primary key,
      nombre text,
      domicilio text,
      edad integer
     );
    
     create table varones(
      documento text primary key,
      nombre text,
      domicilio text,
      edad integer
     );
    
  3. Ingrese los siguientes registros:

     insert into mujeres (documento, nombre, domicilio, edad)
       values('1','Maria Lopez','Colon 123',45);
     insert into mujeres (documento, nombre, domicilio, edad)   
       values('2','Liliana Garcia','Sucre 456',35);
     insert into mujeres (documento, nombre, domicilio, edad)      
       values('3','Susana Lopez','Avellaneda 98',41);
    
     insert into varones (documento, nombre, domicilio, edad)      
       values('10','Juan Torres','Sarmiento 755',44);
     insert into varones (documento, nombre, domicilio, edad)         
       values('11','Marcelo Oliva','San Martin 874',56);
     insert into varones (documento, nombre, domicilio, edad)            
       values('12','Federico Pereyra','Colon 234',38);
     insert into varones (documento, nombre, domicilio, edad)            
       values('13','Juan Garcia','Peru 333',50); 
    
  4. La agencia necesita la combinación de todas las personas de sexo femenino con las de sexo masculino. Use un "cross join"

  5. Realice la misma combinación pero considerando solamente las personas mayores de 40 años.

  6. Forme las parejas pero teniendo en cuenta que no tengan una diferencia superior a 10 años.

Solución
 drop table if exists mujeres;
 drop table if exists varones;
 
 create table mujeres(
  documento text primary key,
  nombre text,
  domicilio text,
  edad integer
 );

 create table varones(
  documento text primary key,
  nombre text,
  domicilio text,
  edad integer
 );
 
 insert into mujeres (documento, nombre, domicilio, edad)
   values('1','Maria Lopez','Colon 123',45);
 insert into mujeres (documento, nombre, domicilio, edad)   
   values('2','Liliana Garcia','Sucre 456',35);
 insert into mujeres (documento, nombre, domicilio, edad)      
   values('3','Susana Lopez','Avellaneda 98',41);

 insert into varones (documento, nombre, domicilio, edad)      
   values('10','Juan Torres','Sarmiento 755',44);
 insert into varones (documento, nombre, domicilio, edad)         
   values('11','Marcelo Oliva','San Martin 874',56);
 insert into varones (documento, nombre, domicilio, edad)            
   values('12','Federico Pereyra','Colon 234',38);
 insert into varones (documento, nombre, domicilio, edad)            
   values('13','Juan Garcia','Peru 333',50);
 
 select m.nombre,m.edad,v.nombre,v.edad
  from mujeres as m
  cross join varones as v;
  
 select m.nombre,m.edad,v.nombre,v.edad
  from mujeres as m
  cross join varones as v
  where m.edad>40 and
  v.edad>40;

 select m.nombre,m.edad,v.nombre,v.edad
  from mujeres as m
  cross join varones as v
  where m.edad-v.edad between -10 and 10;  

Ejecución de ejercicios online

Puede ejecutar comandos de SQLite directamente en el sitio sin tener que instalar nada en su computadora.

Resultado.....