# Sentencia DELETE

Crono SQL soporta la sintaxis estándar de la sentencia DELETE de SQL:

DELETE FROM dwh.FactSalesOrderDetails WHERE SalesOrderId=43659

Si intervienen otras tablas, se puede definir el predicado utilizando las expresiones IN() o EXISTS (). La siguiente sentencia elimina las líneas de venta de un cliente en concreto:

DELETE 
FROM dwh.FactSalesOrderDetails
WHERE SalesOrderSid in (
  SELECT SalesOrderSid
  FROM dwh.FactSalesOrderHeader
  INNER JOIN dwh.DimCustomers using FactSalesOrderHeader(CustomerSid)
  WHERE DimCustomers.Customer='Oscar Simmons')

De modo similar, la siguiente sentencia elimina las líneas de venta de otro cliente:

DELETE 
FROM dwh.FactSalesOrderDetails 
WHERE EXISTS (
  SELECT *  
  FROM dwh.FactSalesOrderHeader cab
  INNER JOIN dwh.DimCustomers using cab(CustomerSid)
  WHERE
    DimCustomers.Customer='Oscar Simmons'
    AND FactSalesOrderDetails.SalesOrderSid=cab.SalesOrderSid)

Crono SQL propone otra sintaxis de la sentencia DELETE (idéntica a la sintaxis de INSERT, UPDATE, y MERGE). La idea subyacente es que se ha de construir el SELECT de los datos que se quieren borrar. Solo el SELECT. Y Crono SQL eliminará precisamente esos registros:

DELETE dwh.FactSalesOrderDetails
select det.SalesOrderDetailSid #SalesOrderDetailSid, det.SalesOrderId, det.SalesOrderDetailsId
from dwh.FactSalesOrderDetails det
inner join dwh.FactSalesOrderHeader using SalesOrderSid
inner join dwh.DimCustomers using FactSalesOrderHeader(CustomerSid)
WHERE DimCustomers.Customer='Jada Morris'

De hecho, no es necesario que la consulta tenga ninguna referencia a la tabla de la que se quieren eliminar registros. El ejemplo anterior se puede simplificar de la siguiente manera:

DELETE dwh.FactSalesOrderDetails 	
SELECT #SalesOrderSid 
FROM dwh.FactSalesOrderHeader 
INNER JOIN dwh.DimCustomers using CustomerSid
WHERE
  DimCustomers.Customer='Katherine Turner'

En todos los casos, lo que marca los registros que se deben eliminar es la "clave de eliminación" (marcada con el carácter #).

La consulta del DELETE también puede utilizar todas las características del SELECT de Crono SQL. La siguiente sentencia elimina los clientes sin ninguna venta:

DELETE dwh.DimCustomers
SELECT #customerSid
FROM dwh.DimCustomers
ANTI JOIN dwh.FactSalesOrderHeader USING CustomerSid