2014-02-28 13 views
5

ich so (SQL2008) eine Tabelle haben:von streichen größer als 1 zählen, aber eine Reihe halten

id url     updated 
1 http://url1.com  null 
2 http://url2.com  <datetime> 
3 http://url1.com  <datetime> 

ich eine der url1.com Datensätze löschen möchten (vorzugsweise aktualisiert, wenn nicht null wenn es funktioniert nicht auf diese Weise arbeiten, aber seine Ordnung)

ich habe diese Abfrage, die alle Duplikate löscht - aber nicht halten eine Aufzeichnung (das ist, wo ich bin verwirrt):

DELETE FROM [table] WHERE url IN (
    SELECT url 
    FROM [table] 
    GROUP BY url 
    HAVING COUNT(*) > 1) 

Wie beschränke ich das Löschen? Ergebnis würde im Idealfall sein:

id url     updated 
1 http://url1.com  null 
2 http://url2.com  <datetime> 

Gerade jetzt es endet wie:

id url     updated 
2 http://url2.com  <datetime> 

Antwort

8

Wenn SQL2008 ist SQL Server 2008, dann können Sie dies tun:

+1

Was ist das für eine Zauberei? Ich habe die Bestellung einfach umgedreht und danach gesucht. Wo kann ich mehr über diese Abfrage erfahren? – user2124871

+0

Froh, es hat funktioniert. der 'CTE' (allgemeiner Tabellenausdruck) ist eigentlich nicht notwendig, Sie könnten auch eine abgeleitete Tabelle verwenden, aber ich denke, dass dieser Code viel sauberer ist. 'ROW_NUMBER()' ist eine analytische Windowing-Funktion, und sie sind sehr nützlich für viele Dinge, also lohnt es sich, sie nachzuschlagen – Lamak

+0

@Lamak, Sie brauchen nicht das * im CTE – Anon

1

Versuchen Sie, diese

DELETE FROM [table] WHERE id NOT IN (
    SELECT MAX(id) 
    FROM [table] 
    GROUP BY url 
    ) 
Verwandte Themen