Не могли бы вы уточнить, что вам нужно сделать в конечном итоге? Наилучшее решение может зависеть от этого (например, хотите ли вы просто удалить все строки с дублирующими ключами?)
Один из способов - обработать эту таблицу (не уверен, что mySQL ее поддерживает, она из SYBASE), если вам нужны строки с уникальным ключом:
SELECT MIN(id), A, B FROM FOO GROUP BY A, B HAVING COUNT(*)>1
Ваш точный вопрос (хотя я немного растерялся относительно того, зачем вам нужны все строки, кроме id = 2):
SELECT F1.*
FROM FOO F1 ,
(SELECT A, B FROM FOO GROUP BY A, B HAVING COUNT(*)>1) F2
WHERE F1.A=F2.A and F1.B=F2.B
Чтобы удалить все дубликаты, вы можете, например, сделать
DELETE FOO WHERE NOT EXISTS
(SELECT 1 from
(SELECT MIN(id) 'min_id' FROM FOO GROUP BY A, B HAVING COUNT(*)>1) UINIQUE_IDS
WHERE id = min_id)
В качестве альтернативы вы можете сделать
SELECT MIN(id) 'id', A, B INTO TEMPDB..NEW_TABLE
FROM FOO GROUP BY A, B HAVING COUNT(*)>1
TRUNCATE TABLE FOO
// Drop indices on FOO
INSERT FOO SELECT * FROM NEW_TABLE
// Recreate indices on FOO