2017-03-31 2 views
0

Der folgende Code entfernt Datensätze von Tasks, die sich auf inaktive Projekte beziehen, aus der Tabelle.Verwenden von T-SQL EXCEPT mit DELETE/Optimieren einer Abfrage

delete from [Deliverables] where 
[Deliverables].[ProjectID] not in 
(
select 
[ProjectID] from [ActiveProjects] 
) 

Ich habe das nicht wirklich die effizienteste, was zu tun und es ist besser, mit NOT IN mit subquery irgendwo gelesen, dass viele Werte zurückgibt, ist EXCEPT Klausel zu verwenden.

aber wenn ich versuche, den folgenden Code zu verwenden, erhalte ich einen Fehler (falsche Syntax nahe dem Schlüsselwort ‚außer‘.)

delete from [Deliverables] 
except 
select * from [Deliverables], [ActiveProjects] 
where [Deliverables].[ProjectID] = [ActiveProjects].[ProjectID] 

Wie kann ich EXCEPT mit DELETE verwenden? Wenn ich nicht kann, gibt es eine Möglichkeit, meine Abfrage zu optimieren, um schneller auszuführen?

Antwort

3

Sie können auch not exists und Skript versuchen aussehen würde:

delete from [Deliverables] 
where not exists 
    (select 1 
     from [ActiveProjects] 
     where [ActiveProjects].[ProjectID] = [Deliverables].[ProjectID]) 

Wenn in [ActiveProjects] sehr viele Daten vorhanden sind, sollte es eine bessere Lösung sein, jedoch sind alle Daten abhängig. Testen Sie daher die Effizienz vor der Verwendung.

+0

diese Lösung funktionierte für mich, war es deutlich schneller als die Verwendung der NOT IN-Klausel. Vielen Dank! – rufus1530

+0

@ rufus1530, Sie sind herzlich willkommen! – PawelCz

0

es so Versuchen (ändern, um Ihren Bedarf durch Hinzufügen von where-Klauseln und Spaltennamen usw.)

delete from table1 
    from table1 a 
inner join 
     (select your_column 
      from table1 
     except 
     select your_column 
      from table2 
    ) b 
    on a.your_column = b.your_column; 
Verwandte Themen