77 - Insertar registros con valores de otra tabla (insert - select - join)


Problema:

Tenemos las tabla "libros", "editoriales" y "cantidadporeditorial".

Eliminamos las 3 tablas si existen:

 drop table libros, editoriales, cantidadporeditorial;

Creamos las tablas:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(30),
  autor varchar(30),
  codigoeditorial tinyint unsigned,
  precio decimal(5,2) unsigned,
  primary key(codigo)
 );

 create table editoriales(
  codigo tinyint unsigned auto_increment,
  nombre varchar(20),
  primary key(codigo)
 );
 
 create table cantidadporeditorial(
  nombre varchar(20),
  cantidad smallint unsigned
 );

Ingresamos algunos registros para las 2 primeras tablas:

 insert into libros values (1,'El aleph','Borges',2,23.5);
 insert into libros values (2,'Alicia en el pais de las maravillas',
                            'Lewis Carroll',1,15);
 insert into libros values (3,'Matematica estas ahi','Paenza',2,34.6);
 insert into libros values (4,'Martin Fierro','Jose Hernandez',3,43.5);
 insert into libros values (5,'Martin Fierro','Jose Hernandez',2,12);

 insert into editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Paidos');
 insert into editoriales values(4,'Plaza & Janes');

Queremos insertar registros en la tabla "cantidadporeditorial", los nombres de las distintas editoriales de las cuales tenemos libros y la cantidad de libros de cada una de ellas.

Podemos lograrlo en 2 pasos: 1º) realizar la consulta a las tablas "libros" y "editoriales" para obtener el nombre y la cantidad de cada editorial y 2º) insertar los registros uno a uno en la tabla "cantidadporeditorial".

O podemos lograrlo en un solo paso, realizando el "insert" y el "select" en una misma sentencia:

 insert into cantidadporeditorial
  select e.nombre,count(l.codigoeditorial)
  from editoriales as e
  left join libros as l
  on e.codigo=l.codigoeditorial
  group by e.nombre;

Note que usamos "left join" porque hay una editorial de la cual no tenemos libros; si usáramos "join", esa editorial no aparecería en la lista porque no encontraría coincidencia de códigos.




Retornar