2012-05-10 7 views
3

Можно создать дубликат:
Oracle Delete Rows Matching On Multiple ValuesКак удалить повторяющиеся строки из базы данных Oracle?

У нас есть таблица, которая имела те же данные, вставленные в него дважды случайно означающего большинство (но не все) строки появляется дважды в таблице. Проще говоря, я бы хотел, чтобы оператор SQL удалял одну версию строки, сохраняя другую; Я не против, какая версия будет удалена, поскольку они идентичны.

Структура таблицы что-то вроде:

FID, unique_id, COL3, COL4 ....

Unique_ID является первичным ключом, то есть каждый из них появляется только один раз. FID - это ключ, уникальный для каждой функции, поэтому, если он появляется более одного раза, дубликаты должны быть удалены.

Для выбора функций, которые имеют дубликаты будут:

select count(*) from TABLE GROUP by FID

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

Этот вопрос был задан раньше, и я попытался создать таблицу с отличным, но как мне получить все столбцы, не называя их? Это только получает один столбец FID и перечислением всех столбцов, чтобы держать дает оценку: ORA-00936: missing expression

CREATE TABLE secondtable NOLOGGING as select distinct FID from TABLE

+0

После того, как вы получите решение, я серьезно рекомендую вам нормализовать вашу базу данных, поскольку дублированные записи (так называемая избыточность), скорее всего, являются результатом не нормированной базы данных. – Kushal

+0

@ Kush - мы не можем нормализовать базу данных, потому что ее используют многие различные приложения. Это результат того, что кто-то загрузил данные дважды в 2007 году, но мы этого не используем, поэтому раньше не замечали. Спасибо за предложение, хотя –

ответ

6

Если вы не заботитесь, какая строка сохраняется

DELETE FROM your_table_name a 
WHERE EXISTS(SELECT 1 
       FROM your_table_name b 
       WHERE a.fid = b.fid 
        AND a.unique_id < b.unique_id) 

Как только это будет сделано, вы захотите добавить ограничение к таблице, которое гарантирует, что FID уникален.

1

Предложение

DELETE FROM x WHERE ROWID IN 
(WITH y AS (SELECT xCOL, MIN(ROWID) FROM x GROUP BY xCOL HAVING COUNT(xCOL) > 1) 
SELCT a.ROWID FROM x, y WHERE x.XCOL=y.XCOL and x.ROWIDy.ROWID) 
3

Попробуйте

DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B 
WHERE A.FID = B.FID) 
+0

В теории это то же самое, что и у Justin Cave, однако ваш не работал, поскольку он дал мне ошибку типа данных (несмотря на то, что мой «rowid» был целым числом). –

0

Попробуйте с этим.

DELETE FROM firsttable WHERE unique_ID NOT IN 
(SELECT MAX(unique_ID) FROM firsttable GROUP BY FID) 

EDIT: Одно из объяснений:

SELECT MAX(unique_ID) FROM firsttable GROUP BY FID; 

Этот SQL оператор подберет каждый максимальный unique_id строки из каждого дубликата строк группы. А инструкция delete сохранит эти максимальные строки unique_ID и удалит другие строки каждой дублирующей группы.

0

Вы можете попробовать это.

delete from tablename a 
where a.logid, a.pointid, a.routeid) in (select logid, pointid, routeid from tablename 
group by logid, pointid, routeid having count(*) > 1) 
and rowid not in (select min(rowid) from tablename 
group by logid, pointid, routeid having count(*) > 1) 
+0

Считается, что хороший этикет содержит краткое объяснение того, что делает ваш код. – Neil

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