Eliminazione di righe utilizzando l'istruzione DELETE

L'istruzione DELETE elimina una o più righe da una tabella o vista.

Di seguito viene riportata una forma semplificata della sintassi di DELETE:

DELETE table_or_view

FROM table_sources

WHERE search_condition

Il parametro table_or_view specifica la tabella o vista da cui eliminare le righe. Vengono eliminate tutte le righe di table_or_view che soddisfano le condizioni di ricerca della clausola WHERE. Se la clausola WHERE non è stata specificata, vengono eliminate tutte le righe di table_or_view. Nella clausola FROM vengono specificate altre tabelle o viste e condizioni di join utilizzabili dai predicati della condizione di ricerca della clausola WHERE per qualificare le righe da eliminare da table_or_view.. Le righe non vengono eliminata dalle tabelle menzionate nella clausola FROM, ma solo dalla tabella menzionata in table_or_view.

Le tabelle da cui vengono rimosse tutte le righe rimangono comunque nel database. L'istruzione DELETE infatti elimina solo le righe della tabella. Per rimuovere la tabella dal database, è necessario utilizzare l'istruzione DROP TABLE.

Eliminazione di righe da un heap

Quando vengono eliminate righe da un heap, Motore di database potrebbe utilizzare blocchi a livello di riga o di pagina per l'operazione. Di conseguenza, le pagine rese vuote dall'operazione di eliminazione rimangono allocate all'heap. Se le pagine vuote non vengono deallocate, lo spazio associato non può essere riutilizzato da altri oggetti nel database.

Per eliminare righe in un heap e deallocare pagine, utilizzare uno dei metodi seguenti.

  • Specificare l'hint TABLOCK nell'istruzione DELETE. Tramite l'utilizzo dell'hint TABLOCK, l'operazione di eliminazione considera un blocco condiviso nella tabella anziché un blocco a livello di riga o di pagina. In questo modo è possibile deallocare le pagine. Per ulteriori informazioni sull'hint TABLOCK, vedere Hint di tabella (Transact-SQL).

  • Utilizzare TRUNCATE TABLE se tutte le righe devono essere eliminate dalla tabella.

  • Creare un indice cluster nell'heap prima di eliminare le righe. È possibile rimuovere l'indice cluster dopo aver eliminato le righe. Questo metodo richiede tempi più lunghi rispetto ai metodi precedenti e utilizza un maggior numero di risorse temporanee.

Per ulteriori informazioni sui blocchi, vedere Utilizzo dei blocchi in Motore di database.

Esempi

Nell'esempio seguente vengono eliminate tutte le righe dalla tabella SalesPersonQuotaHistory in quanto una clausola WHERE non è utilizzata per limitare il numero di righe eliminate.

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

Nell'esempio seguente vengono eliminate tutte le righe dalla tabella ProductCostHistory nella quale il valore della colonna StandardCost è maggiore di 1000.00.

USE AdventureWorks2008R2;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

In questo esempio viene illustrata l'estensione Transact-SQL che consente di eliminare i record da una tabella di base basata su un join o una subquery correlata. La prima istruzione DELETE illustra la soluzione di subquery compatibile con ISO, mentre la seconda istruzione DELETE illustra l'estensione Transact-SQL. Entrambe le query rimuovono righe dalla tabella SalesPersonQuotaHistory in base alle vendite dell'ultimo anno archiviate nella tabella SalesPerson.

-- SQL-2003 Standard subquery

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE BusinessEntityID IN 
    (SELECT BusinessEntityID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;

GO