Saltar la navegación

4.6. Borrado con subconsultas

Las sentencias DELETE con condiciones de búsqueda simples, como las de los ejemplos anteriores, seleccionan las filas a suprimir basándose únicamente en los propios contenidos de las filas.

A veces, la selección de las filas debe efectuarse en base a datos contenidos en otras tablas. Por ejemplo, supongamos que se desea suprimir todos los pedidos aceptados por ‘Soledad Martinez’. Sin saber su número de empleado no se pueden determinar los pedidos a eliminar consultando únicamente la tabla PEDIDOS. Podría pensar en hallar todos los pedidos utilizando una consulta de dos tablas como la siguiente:

SELECT IdPedido, Pedidos.Cargo FROM Pedidos, Empleados WHERE Pedidos.IdEmpleado=Empleados.IdEmpleado AND nombre="Anne";

Pero no es posible utilizar una composición en una sentencia DELETE. El modo de manejar la petición es con una de las condiciones de búsqueda subconsulta. El siguiente ejemplo permitiría borrar las 43 filas de pedidos aceptados por "Anne":

DELETE FROM Pedidos WHERE IdEmpleado=(SELECT IdEmpleado FROM Empleados WHERE nombre="Anne");

Ejemplos

Suprime los productos vendidos cuyos importes de venta sean inferiores a 5000.

DELETE FROM Productos WHERE IdProducto IN (SELECT IdProducto FROM `Detalles de pedidos` as dp WHERE IdProducto AND (Cantidad*PrecioUnidad*(1-Descuento))<5000);

Suprime los clientes que no han realizado pedidos desde el 10 de Noviembre de 1999.

DELETE FROM Clientes WHERE NOT EXISTS (SELECT * FROM Pedidos WHERE Clientes.IdCliente=Pedidos.IdCliente AND FechaPedido>="1999/11/10");