2014-02-28 19 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 
    )