There is more than one way to do this. Based on the SQL shown, it is possible to do this:
DELETE FROM vendaproduto
WHERE
pro_codigo IN (
SELECT a.pro_codigo FROM vendaproduto a
WHERE a.pro_codigo in (
SELECT b.pro_codigo FROM vendaproduto b
WHERE a.pro_codigo = b.pro_codigo
AND a.ven_codigo = b.ven_codigo
AND b.ven_codigo = 2432
GROUP BY b.pro_codigo
HAVING COUNT(*) != 1 )
)
Or of this, without HAVING:
DELETE FROM vendaproduto vp
LEFT JOIN
(
SELECT MIN(pro_codigo) pro_codigo, ven_codigo
FROM vendaproduto
GROUP BY pro_codigo
) b ON vp.pro_codigo = b.pro_codigo AND
vp.ven_codigo = b.ven_codigo
AND b.ven_codigo = 2432 --se remover esta linha, ele busca e elimina todos os registros com pro_codigo e pro_codigo duplicados no banco de dados, mantendo o último registro
WHERE b.pro_codigo IS NULL
Or else this, which is my favorite, for being the simplest to understand:
DELETE
FROM
vendaproduto
WHERE
pro_codigo IN (
SELECT
a.pro_codigo
FROM
vendaproduto a
WHERE
a.pro_codigo < (
SELECT MAX(b.pro_codigo)
FROM
vendaproduto b
WHERE
a.pro_codigo = b.pro_codigo
AND a.ven_codigo = b.ven_codigo
AND b.ven_codigo = 2432
)
)
In all of them, removing the line corresponding to the code filter 2432, it is possible to remove all duplicates while keeping the latest record.
If possible, put the SQL code involved (table creation and query) in the SQL Fiddle, so it’s easier to help :)
– Dherik