81 - Borrar registros buscando coincidencias en otras tablas (delete - join)


Problema:

Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas editoriales y sus códigos.

Eliminamos ambas tablas si existen:

 drop table if exists libros, editoriales;

Creamos las tablas:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  autor varchar(30),
  codigoeditorial tinyint unsigned,
  primary key(codigo)
 );

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

Ingresamos algunos registros:

 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');

 insert into libros values (1,'El aleph','Borges',2);
 insert into libros values (2,'Alicia en el pais de las maravillas','Lewis Carroll',1);
 insert into libros values (3,'Matematica estas ahi','Paenza',2);
 insert into libros values (4,'Martin Fierro','Jose Hernandez',3);
 insert into libros values (5,'Martin Fierro','Jose Hernandez',2);
 insert into libros values (6,'Aprenda PHP','Mario Molina',9);

Queremos eliminar todos los libros cuyo código de editorial no exista en la tabla "editoriales". Podemos hacerlo en 2 pasos: 1) realizamos un left join para ver qué "codigoeditorial" en "libros" no existe en "editoriales", nos retorna el libro con código "5", recordamos el valor, y 2) borramos todos los libros mostrados en la consulta anterior (uno solo, con código 5).

O podemos realizar la eliminación en el mismo momento que realizamos el "left join":

 delete libros
  from libros
  left join editoriales
  on libros.codigoeditorial=editoriales.codigo
  where editoriales.codigo is null;

Veamos si el libro se ha eliminado:

 select * from libros;

Eliminemos todas las editoriales de las cuales no haya libros:

 delete editoriales
  from editoriales
  left join libros
  on libros.codigoeditorial=editoriales.codigo
  where libros.codigo is null;

Veamos si se ha eliminado:

 select * from editoriales;



Retornar