在几个条件下删除所有重复的主题

时间:2010-11-09 12:35:26

标签: mysql sql duplicates sql-delete

我正在尝试让sql删除所有重复的标题但是必须删除具有以下条件的重复项:

  • 必须仅删除具有相同 object_id
  • 的重复项
  • 必须只保留最新记录(最大 topic_id )(topic_id是每个主题AI的唯一ID)

到目前为止,我已经完成了(使用select ...进行测试)

SELECT topic_id,object_id,title,url,date 
FROM topics GROUP BY title 
HAVING ( COUNT(title) > 1) 
ORDER BY topic_id DESC

但不符合条件。
我正在使用mysql。

4 个答案:

答案 0 :(得分:5)

MySQL中,您无法在子查询中将目标表指定为DML操作(除非您将其嵌套多个深度,但在这种情况下,您将无法获得可靠的结果,不能使用相关子查询。)

使用JOIN

DELETE  td
FROM    topics td
JOIN    topics ti
ON      ti.object_id = td.object_id
        AND ti.title = td.title
        AND ti.topic_id > td.topic_id;

topics (object_id, title, topic_id)上创建一个索引,以便快速工作。

答案 1 :(得分:1)

这将删除所有重复的object_id记录,保存具有最高topic_id的记录。

delete from topics outer where exists
(
    select 1 from topics inner where 
        outer.object_id = inner.object_id AND 
        inner.topic_id  < outer.topic_id
)

答案 2 :(得分:0)

首先,如果您有一个日期字段,那么您最好根据日期确定最新记录。

这将有效:

SELECT topic_id, object_id, title, url, date 
FROM   topics earlier
WHERE  EXISTS 
    (SELECT newest.topic_id 
     FROM   topics newest 
     WHERE  newest.date      > earlier.date 
     AND    newest.object_id = earlier.object_id)

您选择的行与另一行具有相同的object_id和更近的日期。

答案 3 :(得分:-1)

WITH tbl AS(SELECT topic_id,object_id,row_number()over(由object_id DESC按object_id顺序划分)作为rnum
FROM主题) DELETE tbl WHERE rnum&gt; 1

有关详细信息,请查看此文章: http://blog.sqlauthority.com/2009/06/23/sql-server-2005-2008-delete-duplicate-rows/