2014-10-29 2 views
0

У меня есть таблица с 14 столбцами, которую можно назвать столбцом_1 - column_14. Мне нужна таблица, которая уникальна в комбинации из двух полей (например, column_1 и column_2). Я не могу иметь никаких экземпляров в этой таблице, где в столбцах_1 и 2 есть несколько строк, содержащих одну и ту же информацию. Чтобы дать ясное представление о том, что я имею в виду, я ссылался на это сообщение, чтобы идентифицировать дубликаты, о которых я говорю.Удалить дубликаты на основе двух полей

Я ссылается this post

Теперь, мне нужно, чтобы узнать, как удалить эти строки из моей таблицы, так что я остался с совершенно уникальными строками на основе столбцов 1 & 2.

Спасибо

+0

Вам нужно предложение 'group by'. –

ответ

2

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

SELECT * FROM your_table 
WHERE rowid not in 
(SELECT MIN(rowid) 
FROM your_table 
GROUP BY column1, column2); //those are the columns that define which row is unique 

для того, чтобы удалить дю plicates

DELETE FROM your_table 
WHERE rowid not in 
(SELECT MIN(rowid) 
FROM your_table 
GROUP BY column1, column2); //those are the columns that define row is unique 
+0

Что я могу заменить на id? Oracle сказал мне, неверный идентификатор. –

+0

Первичный ключ вашей таблицы или уникальный идентификатор для каждой строки – geoandri

+0

Уникального идентификатора нет. Column_1 является самым уникальным идентификатором, который у меня есть, поэтому проблема возникает, когда есть дубликаты. –

1

Oracle имеет псевдо-столбец rowid, который может быть использован именно для этой цели. Это означает, что вы можете делать то, что хотите, даже если ваши данные не имеют уникальных идентификаторов (что довольно часто встречается в базах данных Oracle, поскольку настройка первичного ключа с автоматическим увеличением является болезненным до Oracle 12).

код выглядит следующим образом:

DELETE FROM table t 
    WHERE rowid > (SELECT min(rowid) FROM table t2 WHERE t2.col1 = t.col1 and t2.col2 = t.col2); 

Обратите внимание, что min(rowid) является произвольной строки. Это не обязательно первая строка, вставленная с двумя значениями.

+0

В таблице никогда не упоминается только т ... только t2. Следовательно, это не сработало бы для меня –

+0

@DillonTagle. , , Я по ошибке оставил псевдоним столбца из 'from'. –

-1
WITH Temp (column_1, column_2, duplicateRecCount) 
AS 
(
SELECT column_1, column_2, ROW_NUMBER() OVER(PARTITION by column_1, column_2 ORDER BY column_1, column_2) 
AS duplicateRecCount 
FROM Your_Table 
) 
--Now Delete Duplicate Records 
DELETE FROM Temp 
WHERE duplicateRecCount > 1 
+0

Я думал то же самое, но это недействительно в Oracle. Кроме того, если вы выделите весь свой код и нажмите кнопку '{}', он будет форматировать его как код. –

Смежные вопросы