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


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.

La tabla "libros" tiene la siguiente estructura:

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

La tabla "editoriales" tiene esta estructura:

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

Ambas tablas contienen registros.

Queremos eliminar todos los libros cuyo código de editorial no exista en la tabla "editoriales".

Podemos hacerlo en 2 pasos:

1º paso: realizamos un left join para ver qué "codigoeditorial" en "libros" no existe en "editoriales":

 select l.* from libros as l
  left join editoriales as e
  on l.codigoeditorial=e.codigo
  where e.codigo is null;

recordamos el valor de los códigos de libro devueltos (valor 5) o lo almacenamos en una variable.

2º paso: borramos todos los libros mostrados en la consulta anterior (uno solo, con código 5):

 delete libros
  where codigo=5;

O podemos realizar la eliminció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;

Es decir, usamos "delete" junto al nombre de la tabla de la cual queremos eliminar registros, luego realizamos el "left join" correspondiente nombrando las tablas involucradas y agregamos la condición "where" para que seleccione solamente los libros cuyo código de editorial no se encuentre en "editoriales".

Ahora queremos eliminar 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;

Retornar