У меня есть строки в таблице базы данных 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
Может кто-то подсказать, что я делаю неправильно, и / или как решить эту проблему?
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
Измените 3 поля в начальном выборе на
SELECT
t1.entity_id, t1.station_id, t1.obs_year
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)
Не могли бы вы создать новую таблицу, включающую уникальное ограничение, а затем копировать данные строка за строкой, игнорируя сбои?
Перепишите свой запрос
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
).
Вам нужно указать таблицу для столбцов в основном селекте. Кроме того, если 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