66 - Varias tablas (cross join) |
"cross join" retorna todos los registros de todas las tablas implicadas en la unión, devuelve el producto cartesiano. No es muy utilizado.
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.
El restaurante quiere combinar los registros de ambas tablas para mostrar los distintos menúes que ofrece. Podemos usar "cross join":
select c.*,p.* from comidas as c cross join postres as p;
es igual a un simple "join" sin parte "on":
select c.*,p.* from comidas as c join postres as p;
Podemos organizar la salida del "cross join" para obtener el nombre del plato principal, del postre y el precio total de cada combinación (menú):
select c.nombre,p.nombre, c.precio+p.precio as total from comidas as c cross join postres as p;
Para realizar un "join" no es necesario utilizar 2 tablas, podemos combinar los registros de una misma tabla. Para ello debemos utilizar 2 alias para la tabla.
Si los datos de las tablas anteriores ("comidas" y "postres") estuvieran en una sola tabla con la siguiente estructura:
create table comidas( codigo tinyint unsigned auto_increment, nombre varchar(30), rubro varchar(20),/*plato principal y postre*/ precio decimal (5,2) unsigned, primary key(codigo) );
Podemos obtener la combinación de platos principales con postres empleando un "cross join" con una sola tabla:
select c1.nombre,c1.precio,c2.nombre,c2.precio from comidas as c1 cross join comidas as c2 where c1.rubro='plato principal' and c2.rubro='postre';
Se empleó un "where" para combinar "plato principal" con "postre".
Si queremos el monto total de cada combinación:
select c1.nombre,c2.nombre, c1.precio+c2.precio as total from comidas as c1 cross join comidas as c2 where c1.rubro='plato principal' and c2.rubro='postre';