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


Tenemos las tabla "libros" y "editoriales", que contienen registros, y la tabla "cantidadporeditorial", que no contiene registros.

La tabla "libros" tiene la siguiente estructura:

 -codigo: int unsigned auto_increment,
 -titulo: varchar(30),
 -autor: varchar(30),
 -codigoeditorial: tinyint unsigned,
 -precio: decimal(5,2) unsigned,
 -clave primaria: codigo.

La tabla "editoriales":

 -codigo: tinyint unsigned auto_increment,
 -nombre: varchar(20),
 -clave primaria: codigo.

La tabla "cantidadporeditorial":

 -nombre: varchar(20),
 -cantidad: smallint unsigned.

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º paso: consultar con un "join" los nombres de las distintas editoriales de "libros" y la cantidad:

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

obteniendo una salida como la siguiente:

  editorial	cantidad
  ______________________
  Emece		3
  Paidos	1	
  Planeta	1
  Plaza & Janes	0

2º paso: insertar los registros uno a uno en la tabla "cantidadporeditorial":

	insert into cantidadporeditorial values('Emece',3);
	insert into cantidadporeditorial values('Paidos',1);
	insert into cantidadporeditorial values('Planeta',1);
	insert into cantidadporeditorial values('Plaza & Janes',0);

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;

Entonces, se puede insertar registros en una tabla con la salida devuelta por una consulta que incluya un "join" o un "left join"; para ello escribimos la consulta y le anteponemos "insert into", el nombre de la tabla en la cual ingresaremos los registros y los campos que se cargarán (si se ingresan todos los campos no es necesario listarlos).

Recuerde que la cantidad de columnas devueltas en la consulta debe ser la misma que la cantidad de campos a cargar en el "insert".

Retornar