2014-02-28 20 views
5

我有這樣的(SQL2008)的表:從那裏數大於1,刪除,但保留一排

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

我想刪除的url1.com記錄之一(優選地,其中更新不爲空,但其優良的,如果它不工作方式)

我有這個疑問,它會刪除所有重複的 - 但不保存記錄(這是我很困惑):

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

我如何限制刪除?結果將理想:

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

現在它結束了,如:

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

回答

8

如果SQL2008是SQL Server 2008中,那麼你可以這樣做:

;WITH CTE AS 
(
    SELECT *, 
      RN = ROW_NUMBER() OVER(PARTITION BY url 
            ORDER BY updated DESC) 
    FROM [table] 
) 
DELETE FROM CTE 
WHERE RN > 1 
+1

什麼是這個巫術!只是將訂單翻過來,這正是我所尋找的。我可以在哪裏瞭解有關此查詢的更多信息 – user2124871

+0

很高興工作。 'CTE'(公用表表達式)實際上並不是必須的,你可以使用派生表,但我認爲這個代碼更清晰。 'ROW_NUMBER()'是一個窗口分析函數,它們對於很多事情都非常有用,因此值得查看它們 – Lamak

+0

@Lamak,你不需要CTE中的* – Anon

1

試試這個

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