2009-07-24 12 views
6

Ho bisogno di creare un'istruzione SQL per eliminare da una determinata tabella i record che corrispondono ad un'altra istruzione select.Sql server DELETE e clausola WITH

In Teradata usiamo

delete from table1 
where (col1, col2) in (
    select col1,col2 
    from table2 
) 

Mentre in SQL Server non è permesso avere più di 1 colonna nella clausola WHERE..IN. Ho pensato di poter usare la clausola WITH:

with tempTable(col1,col2) as (
select col1,col2 
from table2 
) 
delete from table1 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 

Come utilizzare la clausola WITH..DELETE? C'è un altro modo?

risposta

19

Questo dovrebbe farlo:

DELETE Table1 
from Table1 t1 
    inner join tempTable t2 
    on t2.Col1 = t1.Col1 
    and t2.Col2 = t1.Col2 
+1

... si potrebbe utilizzare il CON clausola, ma in questo modo è più semplice. –

+0

grazie ha funzionato! ma come usare WITH..DELETE? – ala

+0

Pensandoci, non vedo alcun motivo per usare la clausola WITH. Uso WITH quando le cose diventano seriamente complicate o complesse e l'eliminazione da una tabella basata su un join semplice su un'altra tabella non è abbastanza complessa da giustificare lo sforzo di codifica aggiuntivo. –

1
delete from table1 t1 where exists 
    ( 

    select 1 from table2 t2 where t1.col1 = t2.col1 and t1.col2 > t2.col2 

) 
+1

Questa sintassi non è corretta –

+1

la sintassi non è corretta, ma l'idea generale è corretta. SQL Server può ottimizzarlo in modo che possa funzionare come una soluzione utilizzando un join pur essendo più facile da leggere IMO. – EvilRyry

4

prima costruire una query che seleziona le righe necessari:

SELECT t1.* 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col2]=t2.[Col2] 

test è per assicurarsi che ritorni esattamente le righe voglio cancellare. Poi trasformarlo in una dichiarazione di cancellazione cambiando il "SELECT" per "CANCELLA" e rimuovere l'elenco delle colonne:

DELETE t1 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col 
+0

Questo è un buon consiglio in SSMS, ma non molto pratico a livello di programmazione .... – RolandTumble

+1

+1 per misurare due volte e tagliare una volta – 2Toad

0
with tempTable(col1,col2) as (
    select col1,col2 
    from table2 
) 
delete table1 from tempTable 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 
+1

È sempre meglio includere alcune spiegazioni piuttosto che avere solo una risposta di solo codice che lo rende più utile per il futuro lettori. – EJoshuaS

+0

Benvenuti in Stack Overflow! Sebbene questo snippet di codice possa risolvere il problema, non spiega perché o come risponda alla domanda. Per favore [includi una spiegazione per il tuo codice] (// meta.stackexchange.com/q/114762/269535), in quanto ciò aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. ** Segnalatori/revisori: ** [Per le risposte di solo codice come questa, downvote, non eliminare!] (// meta.stackoverflow.com/a/260413/2747593) –

0

Questo funziona per me

WITH CTE AS 
(
SELECT TOP 50000 * 
from v020101hist order by data 
) 
DELETE FROM CTE 
Problemi correlati