I to było brzydkie. Działa dobrze, dopóki DB nie zostanie poważnie obciążone, a potem wszystko idzie bardzo powoli. Wynika to głównie z ograniczeń IO serwera, ale prostszym podejściem było umieszczenie isfiction i isNonFiction w tabelach MEMORY, a instrukcja DELETE może wtedy wyglądać tak:
DELETE tmp_table FROM tmp_table
INNER JOIN
(
SELECT ASIN, MAX( isFiction ) AS isFiction, MAX( isNonFiction ) AS isNonFiction
FROM tmp_table
GROUP BY ASIN
HAVING isFiction =1
AND isNonFiction =1
) D
WHERE D.ASIN=tmp_table.ASIN AND tmp_table.isNonFiction=1
W testach skraca to cały proces z około 90 sekund do 10 sekund.