2016-11-02 3 views
0

Ich versuche Duplikate unter Code zu löschen:falsche Syntax beim Löschen von Duplikaten

delete [TABLE] f 
where id not in (select min(id) 
       from [TABLE] s 
       where f.companyid = s.companyid 
       and f.value = s.value) 

aber es gibt mir unten Fehlermeldung:

Msg 102, Ebene 15, Status 1, Zeile 1
Falsche Syntax in der Nähe von 'f'.

Was ist falsch an der Syntax?

+1

Welches RDBMS? . – sagi

+0

löschen VON [TABELLE] f? – Artix

+0

es ist MS SQL Server, Version 11.0.6020.0 – Turpan

Antwort

1

In SQL Server, wie ich CTEs und row_number() für diesen Zweck zu verwenden:

with todelete as (
     select t.*, 
      row_number() over (partition by companyid, value order by id) as seqnum 
     from t 
    ) 
delete todelete 
    where seqnum > 1; 

Aber das Problem mit Ihrer Syntax ist, dass es anfangen soll:

delete f from [TABLE] f 
    where . . . 

Mit anderen Worten, Tabelle Aliase sind in der FROM Klausel definiert.

+0

Danke, es funktioniert, nachdem ich die Syntax geändert habe. – Turpan

+0

In Bezug auf Ihre erste Beratung, werde ich auch versuchen, warum magst du es mehr? es scheint zu kompliziert. – Turpan

+0

@Turpan. . . Irgendwie finde ich die Absicht der Abfrage klarer als die Verwendung der Unterabfrageversion. Ich beachte, dass dies kein Standard-SQL ist, daher wird es nur von SQL Server unterstützt (soweit ich weiß). –

0
delete from [TABLE] f 
where id not in (select min(id) from [TABLE] s 
where f.companyid = s.companyid 
and f.value = s.value) 
+0

das ist es das gleiche Ich habe geschrieben :) – Turpan

+0

Sie hatten 'von' verpasst, was ist Ihr Tabellenname? –

0
DELETE FROM [TABLE] f 
WHERE id NOT IN (SELECT MIN(id) FROM [TABLE] s 
        where f.companyid = s.companyid and f.value = s.value) 
0

Löschen von f wobei id nicht in (wähle min (id) aus, wo s = f.companyid s.companyid und f.value = s.value);

VERSUCHEN SIE ES.

+0

gibt immer noch den gleichen Fehler – Turpan

+0

seine Arbeit für mysql –

0

Es gibt Fehler, weil falsche falsche Verwendung von Alias ​​die Tabelle. Um Ihre Tabelle mit einer delete-Anweisung zu aliasieren, können Sie;

delete f from [TABLE] as f 
where id not in (
    select min(id) from [TABLE] s 
    where f.companyid = s.companyid 
    and f.value = s.value 
)