первая мысль:
delete from qvalues where rid not in
(
select min(rid) from qvalues
group by name,compound,rowid
having COUNT(*)>1
UNION
select min(rid) from qvalues
group by name,compound,rowid
having COUNT(*)=1);
Возможно, также неплохо бы убедиться, что sql-сервер знает, что вы делаете «некоррелированный подвыбор» (потому что «коррелированные подвыборы» занимают намного больше времени):
delete from qvalues a where a.rid not in
(
select min(b.rid) from qvalues b
group by b.name,b.compound,b.rowid
having COUNT(*)>1
UNION
select min(c.rid) from qvalues c
group by c.name,c.compound,c.rowid
having COUNT(*)=1);
и, конечно, вы должны рассмотреть возможность использования индексов (особенно для rid, но также для имени, составного, rowid)
Мои SQL не проверены - надеюсь, вы поймете, что я пытался показать.
PS: ваш sql требует много вычислений (особенно предложений HAVING
), не могли бы вы попытаться найти другое решение для вашей проблемы?