Предполагая, что id
уникален, я бы сказал это в Postgres как:
DELETE component c USING
(SELECT c2.*,
ROW_NUMBER() OVER (PARTITION BY key ORDER BY id) as seqnum
FROM component c2
) c2
WHERE c2.id = c.id AND c2.seqnum > 1;
Или используя коррелированный подзапрос:
DELETE component c
WHERE c.id > (SELECT MIN(c2.id)
FROM component c2
WHERE c2.key = c.key
);
Ваша версия (которая использует SQL Синтаксис сервера) может найти несколько совпадений для каждой удаляемой строки.