Вам необходимо уточнить ваше правило для определения того, какую запись вести в случае «совпадения» - самой последней, самой ранней, той, которая имеет is_disabled
true или false?
Onceвы определили это правило, а все остальное довольно просто:
- выберите записи, которые вы хотите сохранить -
distinct
records - присоединятся к исходной таблице, чтобы получитьидентификаторы для этих записей.
- удаляйте все, что не входит в объединенный набор данных.
Итак, допустим, вы хотите сохранить самые последние записи любой «дублированной» пары.Ваш запрос будет выглядеть следующим образом:
DELETE FROM [table] WHERE supply_req_id NOT IN
(SELECT supply_req_id from [table] t
INNER JOIN
(SELECT MAX(supply_req_dt) dt, request_id, supply_id
FROM [table]
GROUP BY request_id, supply_id) d
ON t.supply_req_dt = d.dt
AND t.request_id = d.request_id
AND t.supply_id = d.supply_id)
Выгода в том, что если supply_req_dt
также дублируется, то вы сохраните оба дубликата.Чтобы исправить это, нужно сделать еще один group by
и выбрать верхний id
select MAX(supply_req_id), supply_req_dt, request_id, supply_id
group by supply_req_dt, request_id, supply_id
в качестве промежуточного шага.Но если вам не нужно этого делать, не беспокойтесь об этом.