2009-07-24 5 views
6

Ich muss eine SQL-Anweisung erstellen, um aus bestimmten Tabellen die Datensätze zu löschen, die eine andere SELECT-Anweisung entsprechen.Sql Server DELETE und WITH-Klausel

In Teradata verwenden wir

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

Während in SQL Server es nicht erlaubt ist, mehr als 1 Spalte in der WHERE..IN Klausel zu haben. Ich dachte, ich kann die WITH-Klausel verwenden:

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

Wie WITH..DELETE-Klausel verwenden? Gibt es eine andere Art und Weise?

Antwort

19

Dies sollte es tun:

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

... Sie die verwenden könnte WITH-Klausel, aber dieser Weg ist einfacher. –

+0

danke es hat funktioniert! aber wie benutzt man WITH..DELETE? – ala

+0

Wenn ich darüber nachdenke, sehe ich keinen Grund, die WITH-Klausel zu verwenden. Ich benutze WITH, wenn die Dinge ernsthaft chaotisch oder komplex werden, und das Löschen von einer Tabelle basierend auf einer einfachen Verknüpfung mit einer anderen Tabelle ist nicht komplex genug, um den zusätzlichen Programmieraufwand zu rechtfertigen. –

1
delete from table1 t1 where exists 
    ( 

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

) 
+1

Diese Syntax falsch –

+1

die Syntax ist falsch ist, aber die allgemeine Idee ist richtig. SQL Server kann dies so optimieren, dass es genauso gut funktioniert wie eine Lösung, die einen Join verwendet, während IMO einfacher zu lesen ist. – EvilRyry

4

zuerst eine Abfrage erstellen, die die Zeilen, die Sie benötigen, wählt:

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

-Test es Sie um sicherzustellen, dass es gibt genau die Zeilen möchte löschen. Dann schalten Sie ihn in eine DELETE-Anweisung durch Ändern der „SELECT“ auf „DELETE“ und Entfernen der Spaltenliste:

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

Das ist ein guter Ratschlag in SSMS, aber nicht sehr praktisch programmatisch .... – RolandTumble

+1

+1 für zweimal messen und einmal schneiden – 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

Es ist immer besser, eine Erklärung zu enthalten, als nur eine Code-only-Antwort zu haben, die es für die Zukunft nützlicher macht Leser. – EJoshuaS

+0

Willkommen bei Stack Overflow! Während dieses Code-Snippet das Problem lösen kann, erklärt es nicht, warum oder wie es die Frage beantwortet. Bitte [fügen Sie eine Erklärung für Ihren Code hinzu] (// meta.stackexchange.com/q/114762/269535), da dies wirklich zur Verbesserung der Qualität Ihres Posts beiträgt. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. ** Flaggers/Reviewer: ** [Für Code-only-Antworten wie diesen, downvote, nicht löschen!] (// meta.stackoverflow.com/a/260413/2747593) –

0

Dies funktioniert für mich

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