SQL: Как найти дубликаты на основе двух полей?

У меня есть строки в таблице базы данных Oracle, которые должны быть уникальными для комбинации двух полей, но уникальное ограничение не установлено в таблице, поэтому мне нужно найти все строки, которые сами нарушают ограничение, используя SQL. К сожалению, мои скудные навыки SQL не подходят для этой задачи.

В моей таблице три релевантных столбца: entity_id, station_id и obs_year. Для каждой строки комбинация station_id и obs_year должна быть уникальной, и я хочу выяснить, есть ли строки, которые нарушают это, сбрасывая их с помощью SQL-запроса.

Я пробовал следующий SQL (предложенный этот предыдущий вопрос ), но он не работает для меня (у меня столбец ORA-00918 определен неоднозначно):

SELECT
entity_id, station_id, obs_year
FROM
mytable t1
INNER JOIN (
SELECT entity_id, station_id, obs_year FROM mytable 
GROUP BY entity_id, station_id, obs_year HAVING COUNT(*) > 1) dupes 
ON 
t1.station_id = dupes.station_id AND
t1.obs_year = dupes.obs_year

Может кто-то подсказать, что я делаю неправильно, и / или как решить эту проблему?

20
задан Community 23 May 2017 в 12:09
поделиться

6 ответов

SELECT  *
FROM    (
        SELECT  t.*, ROW_NUMBER() OVER (PARTITION BY station_id, obs_year ORDER BY entity_id) AS rn
        FROM    mytable t
        )
WHERE   rn > 1
40
ответ дан 29 November 2019 в 22:58
поделиться

Измените 3 поля в начальном выборе на

SELECT
t1.entity_id, t1.station_id, t1.obs_year
2
ответ дан 29 November 2019 в 22:58
поделиться
SELECT entity_id, station_id, obs_year
FROM mytable t1
WHERE EXISTS (SELECT 1 from mytable t2 Where
       t1.station_id = t2.station_id
       AND t1.obs_year = t2.obs_year
       AND t1.RowId <> t2.RowId)
12
ответ дан 29 November 2019 в 22:58
поделиться

Не могли бы вы создать новую таблицу, включающую уникальное ограничение, а затем копировать данные строка за строкой, игнорируя сбои?

1
ответ дан 29 November 2019 в 22:58
поделиться

Перепишите свой запрос

SELECT
t1.entity_id, t1.station_id, t1.obs_year
FROM
mytable t1
INNER JOIN (
SELECT entity_id, station_id, obs_year FROM mytable 
GROUP BY entity_id, station_id, obs_year HAVING COUNT(*) > 1) dupes 
ON 
t1.station_id = dupes.station_id AND
t1.obs_year = dupes.obs_year

Я думаю, неоднозначная ошибка столбца (ORA-00918) была вызвана тем, что вы выбрали столбцы, имена которых присутствовали в обеих таблицах. и подзапрос, но вы не указали, хотите ли вы его из dupes или из mytable (с псевдонимом t1 ).

2
ответ дан 29 November 2019 в 22:58
поделиться

Вам нужно указать таблицу для столбцов в основном селекте. Кроме того, если entity_id является уникальным ключом для моей таблицы и не имеет отношения к поиску дубликатов, вы не должны группироваться по нему в подзапросе dupes.

Try:

SELECT t1.entity_id, t1.station_id, t1.obs_year
FROM mytable t1
INNER JOIN (
SELECT station_id, obs_year FROM mytable 
GROUP BY station_id, obs_year HAVING COUNT(*) > 1) dupes 
ON 
t1.station_id = dupes.station_id AND
t1.obs_year = dupes.obs_year
1
ответ дан 29 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: