2016-06-07 16 views
1

Ich versuche, doppelte Datensätze zu löschen, die keinen bestimmten Status enthalten.Löschen von bestimmten doppelten Datensätzen

Hier ist mein Code:

DELETE FROM [dbo].[test] 
WHERE ID NOT IN (SELECT MAX(ID) 
        FROM [dbo].[test] 
        GROUP BY [UserID]) 
AND Status <> 'D' 

Ich brauche alle doppelten Datensätze mit Ausnahme der Datensätze zu löschen, die den Status ‚D‘ enthalten. Der Fehler, den es mir gibt, ist falsche Syntax.

Das ultimative Problem ist, dass ich Daten aus zwei Tabellen einfügen. Eine Tabelle, Support, fügt Informationen ein, die die Master-Tabelle Data aktualisieren müssen. Die andere Tabelle, Identity, stellt die Benutzerdatenbank für die Master-Tabelle bereit. Wenn der Status aus der Support-Tabelle "D" für Disable lautet, muss ich beide Datensätze in der Master-Tabelle behalten.

+0

Warum ist Bedingung "Und Status <> 'D'" außerhalb der Halterung? – DevelopmentIsMyPassion

+0

Keept bekommen Syntaxfehler. –

+0

Probieren Sie meine und @ GordonLinoff-Lösung. – DevelopmentIsMyPassion

Antwort

0

Meinst du das?

DELETE FROM [dbo].[test] 
WHERE Status <> 'D' AND ID NOT IN ( 
SELECT MAX(ID) 
FROM [dbo].[test] 
GROUP BY [UserID]) 
+0

Aus Neugier, was ist der Unterschied zwischen Ihnen und der OP-Abfrage anders als die Bestellung? – BJones

+0

@bjones um ganz ehrlich zu sein, ich habe nur den Zustand an der Spitze bewegt. Ich habe jetzt nichts zu testen, also wirklich nicht sicher, ob es funktioniert oder nicht – DevelopmentIsMyPassion

+0

Beide Abfragen funktionieren gleich. Deshalb habe ich gefragt, was der Unterschied sei. Ich weiß nicht, welchen Unterschied Ihre Anfrage gemacht hat, um sie als Antwort zu akzeptieren. Wie Paparazzi schon sagte, vielleicht war es irgendwo anders. – BJones

0

Ihre Syntax sieht gut aus. Hier ist eine alternative Methode:

with todelete as (
     select t.*, max(id) over (partition by userid) as maxid 
     from dbo.test 
    ) 
delete from todelete 
    where id < maxid and status <> 'D'; 

Ihre Frage erwähnt verschiedene Tabellen, aber diese Abfrage erwähnt nur eine Tabelle. Ich könnte einen Fehler "Spalte nicht gefunden" verstehen, aber Ihre Syntax sieht gut aus.

Verwandte Themen