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;