Sentencia DELETE
Crono SQL soporta la sintaxis estándar de la sentencia DELETE de SQL:
DELETE FROM dwh.FactSalesOrderDetails WHERE SalesOrderId=43659Ver SQL compilado
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:
DELETEFROM dwh.FactSalesOrderDetailsWHERE SalesOrderSid in ( SELECT SalesOrderSid FROM dwh.FactSalesOrderHeader INNER JOIN dwh.DimCustomers using FactSalesOrderHeader(CustomerSid) WHERE DimCustomers.Customer='Oscar Simmons')Ver SQL compilado
DELETE FROM dwh.FactSalesOrderDetails WHERE EXISTS (SELECT 1 FROM ( SELECT SalesOrderSid FROM dwh.FactSalesOrderHeader INNER JOIN dwh.DimCustomers ON (FactSalesOrderHeader.CustomerSid=DimCustomers.CustomerSid) WHERE DimCustomers.Customer='Oscar Simmons') subquery WHERE SalesOrderSid=subquery.SalesOrderSid);De modo similar, la siguiente sentencia elimina las líneas de venta de otro cliente:
DELETEFROM dwh.FactSalesOrderDetailsWHERE EXISTS ( SELECT * FROM dwh.FactSalesOrderHeader cab INNER JOIN dwh.DimCustomers using cab(CustomerSid) WHERE DimCustomers.Customer='Oscar Simmons' AND FactSalesOrderDetails.SalesOrderSid=cab.SalesOrderSid)Ver SQL compilado
DELETE FROM dwh.FactSalesOrderDetails WHERE EXISTS (SELECT *FROM dwh.FactSalesOrderHeader cabINNER JOIN dwh.DimCustomers ON (cab.CustomerSid=DimCustomers.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.FactSalesOrderDetailsselect det.SalesOrderDetailSid #SalesOrderDetailSid, det.SalesOrderId, det.SalesOrderDetailsIdfrom dwh.FactSalesOrderDetails detinner join dwh.FactSalesOrderHeader using SalesOrderSidinner join dwh.DimCustomers using FactSalesOrderHeader(CustomerSid)WHERE DimCustomers.Customer='Jada Morris'Ver SQL compilado
;WITHquery AS ( SELECT det.SalesOrderDetailSid AS SalesOrderDetailSid, det.SalesOrderId AS SalesOrderId, det.SalesOrderDetailsId AS SalesOrderDetailsId FROM dwh.FactSalesOrderDetails det INNER JOIN dwh.FactSalesOrderHeader ON (det.SalesOrderSid=FactSalesOrderHeader.SalesOrderSid) INNER JOIN dwh.DimCustomers ON (FactSalesOrderHeader.CustomerSid=DimCustomers.CustomerSid) WHERE DimCustomers.Customer='Jada Morris')DELETE FROM dwh.FactSalesOrderDetailsWHERE EXISTS (SELECT 1 FROM query WHERE FactSalesOrderDetails.SalesOrderDetailSid=query.SalesOrderDetailSid);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.FactSalesOrderDetailsSELECT #SalesOrderSidFROM dwh.FactSalesOrderHeaderINNER JOIN dwh.DimCustomers using CustomerSidWHERE DimCustomers.Customer='Katherine Turner'Ver SQL compilado
;WITHquery AS ( SELECT SalesOrderSid FROM dwh.FactSalesOrderHeader INNER JOIN dwh.DimCustomers ON (FactSalesOrderHeader.CustomerSid=DimCustomers.CustomerSid) WHERE DimCustomers.Customer='Katherine Turner')DELETE FROM dwh.FactSalesOrderDetailsWHERE EXISTS (SELECT 1 FROM query WHERE FactSalesOrderDetails.SalesOrderSid=query.SalesOrderSid);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.DimCustomersSELECT #customerSidFROM dwh.DimCustomersANTI JOIN dwh.FactSalesOrderHeader USING CustomerSidVer SQL compilado
;WITHquery AS ( SELECT customerSid FROM dwh.DimCustomers WHERE NOT EXISTS (SELECT 1 FROM dwh.FactSalesOrderHeader WHERE DimCustomers.CustomerSid=FactSalesOrderHeader.CustomerSid))DELETE FROM dwh.DimCustomersWHERE EXISTS (SELECT 1 FROM query WHERE DimCustomers.customerSid=query.customerSid);