Попробуйте это в SQL Server:
delete from tbl o
left outer join
(Select max(qty) anz , id
from tbl i
group by i.id) k on o.id = k.id and k.anz = o.qty
where k.id is null
Редакция 2 для MySQL ... Кто-нибудь может проверить это?
delete from tbl o
where concat(id,qty) not in
(select concat(id,anz) from (Select max(qty) anz , id
from tbl i
group by i.id))
Пояснение:
Поскольку я должен был не использовать объединения (см. Комментарии о поддержке MySQL по соединениям и удалению / обновлению / вставке), я переместил подзапрос в предложение IN (a, b, c).
Внутри предложения In я могу использовать подзапрос, но этот запрос может возвращать только одно поле. Таким образом, чтобы отфильтровать все элементы, которые не являются максимальными, мне нужно объединить оба поля в одно, чтобы я мог вернуть его внутри предложения in. Так что в основном мой запрос внутри IN возвращает только самый большой ID + QTY. Чтобы сравнить его с основной таблицей, мне также нужно составить конкатец снаружи, чтобы данные для обоих полей совпадали.
В основном предложение In содержит:
( "A3", "B125")
Отказ от ответственности: приведенный выше запрос "зло!" так как он использует функцию (concat) для полей для сравнения. Это приведет к тому, что любой индекс в этих полях станет практически бесполезным. Никогда не следует формулировать запрос таким образом, чтобы он выполнялся регулярно. Я только хотел попытаться согнуть его, чтобы он работал на MySQL.
Пример этой "плохой конструкции":
(Получить все o за последние 2 недели)
выберите ... из заказов, где orderday + 14> now ()
Вы всегда должны делать:
выберите ... из заказов, где orderday> now () - 14
Разница едва заметна: версия 2 должна выполнять математику только один раз и может использовать индекс, а версия 1 должна выполнять математику для каждой строки в таблице заказов. Вы можете забыть о использование индекса ...