2010-07-17 11 views
5

Questa dovrebbe essere una domanda semplice, ma non ho ancora trovato una risposta chiara. Qualcuno sa come eliminare più righe da una singola tabella in SQL Server 2005, utilizzando una singola query? Mi chiedevo se potesse essere esattamente l'opposto di inserire più righe, usando il metodo UNION ALL. Quindi questo dovrebbe funzionare? :Eliminazione di più righe con una singola query

DELETE FROM Table (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 
etc... 

EDIT: Tengo a precisare che si tratta di una tabella di collegamento che sto cercando di rimuovere i record da. Non esiste una chiave primaria e i valori di ciascuna colonna potrebbero ripetersi. Quindi ho bisogno di essere sicuro che entrambe le colonne contengano un certo valore per lo stesso record prima di rimuovere il record.

risposta

9

Si potrebbe provare questo:

DELETE FROM YourTable 
WHERE (Name = 'Name1' AND Location = 'Location1') 
OR (Name = 'Name2' AND Location = 'Location2') 
OR (Name = 'Name3' AND Location = 'Location3') 
+0

Un intervallo in cui la clausola potrebbe essere appropriata, se si dice che si desidera rimuovere una raccolta prima di una certa data. –

1
DELETE FROM T 
FROM YourTable T 
INNER JOIN (
SELECT 'Name1' AS Name, 'Location1' AS Location 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 
) T2 
ON T2.Name = T.Name 
AND T2.Location = T.Location 
+0

'FROM ' in quel collegamento implica che i JOIN sono consentiti. Sono sicuro che sono come li ho usati molte volte. :) –

+1

Appena provato rispetto a MSSQL 2005 e funziona bene con i Pony OMG. –

2

Utilizzando un CTE ha funzionato per me - molto più facile che usare RUP e staffe:

WITH del AS (
    SELECT 'Name1' AS nam, 'Location1' AS loc 
    UNION ALL 
    SELECT 'Name2', 'Location2' 
    UNION ALL 
    SELECT 'Name3', 'Location3') 
DELETE FROM CLASSES 
WHERE EXISTS(SELECT NULL 
       FROM del d 
       WHERE d.name = name 
       AND d.loc = location) 

Non è possibile definire un alias di tabella per la tabella in un'istruzione delete; qualsiasi riferimento di colonna senza un alias di tabella potrebbe essere considerato relativo alla sola tabella senza uno, ma dipende anche dall'ambito.

Problemi correlati