УДАЛИТЬ все повторяющиеся темы с несколькими условиями - PullRequest
4 голосов
/ 09 ноября 2010

Я пытаюсь сделать sql, который будет удалять все дубликаты заголовков, НО должен удалять дубликаты с такими условиями:

  • должен удалять только дубликаты с одинаковыми object_id
  • должен хранить только самую новую запись (самая большая topic_id ) (topic_id является уникальным идентификатором для каждого AI темы)

До сих пор я делал это (тестирование с помощью 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 ]

5 голосов
/ 09 ноября 2010

В 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 голос
/ 09 ноября 2010

Это удалит все дубликаты записей 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
)
0 голосов
/ 09 ноября 2010

С tbl AS (ВЫБЕРИТЕ topic_id, object_id, row_number () over (разделить по порядку object_id по topic_id DESC) как rnum
ОТ темы) УДАЛИТЬ ТАБЛ. ГДЕ rnum> 1

Для получения дополнительной информации, пожалуйста, проверьте эту статью: http://blog.sqlauthority.com/2009/06/23/sql-server-2005-2008-delete-duplicate-rows/

0 голосов
/ 09 ноября 2010

Во-первых, если у вас есть поле даты, вам лучше определить самые новые записи по их дате.

Это будет работать:

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 и более поздней датой.

...