Как найти повторяющиеся записи в PostgreSQL


190

У меня есть таблица базы данных PostgreSQL под названием «user_links», которая в настоящее время допускает следующие повторяющиеся поля:

year, user_id, sid, cid

Уникальное ограничение в настоящее время является первым поле под названием «идентификатор», однако сейчас я ищу , чтобы добавить ограничение , чтобы убедиться year, user_id, sidи cidвсе уникальны , но я не могу применить ограничение , поскольку повторяющиеся значения уже существуют , которые нарушают это ограничение.

Есть ли способ найти все дубликаты?


Ответы:


335

Основной идеей будет использование вложенного запроса с агрегацией счетчиков:

select * from yourTable ou
where (select count(*) from yourTable inr
where inr.sid = ou.sid) > 1

Вы можете настроить выражение where во внутреннем запросе, чтобы сузить поиск.


Есть еще одно хорошее решение, упомянутое в комментариях (но не все их читают):

select Column1, Column2, count(*)
from yourTable
group by Column1, Column2
HAVING count(*) > 1

Или короче:

SELECT (yourTable.*)::text, count(*)
FROM yourTable
GROUP BY yourTable.*
HAVING count(*) > 1

65
Вы также можете использовать HAVING:select co1, col2, count(*) from tbl group by col1, col2 HAVING count(*)>1
alexkovelsky

1
Спасибо @alexkovelsky за то, что мне легче было изменить заявление, и он работал быстрее. Я бы предложил ответ с ним для большей наглядности.
Весанто

эти параметры сработали для меня, остальные сгруппировали результаты, и эти параметры дали мне все дублированные записи, а не только дублированные записи, спасибо!
rome3ro

1
У меня есть ваш ответ, чтобы быть немного медленным. Для таблицы 10k строк * 18 столбцов запрос занял 8 секунд
aydow

1
это варенье прямо там, братан. черт возьми да Спасибо. D
дпс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.