Можно ли удалить тройные или четырехкратные дубликаты из таблицы Oracle SQL, используя ROWID или другой метод? - PullRequest
0 голосов
/ 24 августа 2018

Я знаю, что можно удалить дубликаты из таблицы, используя ROWID в следующем примере:

DELETE FROM TABLE_NAME 
WHERE ROWID IN 
(SELECT
MIN(ROWID)
FROM TABLE_NAME
WHERE ...
GROUP BY COLUMN_NAME_1, COLUMN_NAME_2, etc. ) 

Интересно, возможно ли это сделать для записей, которые отображаются более чем в 2раз.Если нет, есть ли другие методы, которые нужно сделать?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Я бы не стал использовать not in или даже min или max. Я обычно использую что-то вроде

delete demo where rowid in
( select lead(rowid) over(partition by your_grouping_column order by col1, col2)
  from demo )

lead(rowid) возвращает все «следующие» строки в порядке col1, col2. Первая строка для каждого your_grouping_column (что бы это ни было) не будет в этом списке.

0 голосов
/ 24 августа 2018

Я не знаю, является ли следующий ответ эффективным.Пожалуйста, дайте мне знать, если так.

Предполагая, что Table_V1 - это тот, который включает дубликаты, я создал вторую версию, которая включает количество дубликатов рядом с исходными данными

CREATE TABLE Table_V2 AS ( SELECT A.*, B.CNT FROM Table_V1 A LEFT JOIN (SELECT * FROM (SELECT COL1, COL2, COUNT(COL1) AS CNT FROM Table_V1 GROUP BY COL1, COL2) WHERE CNT>1) B ON A.COL1 = B.COL1 AND A.COL2 = B.COL2);

Затем я удаляю дубликаты / тройки / четверки, и т. Д., Используя следующие строки:

DELETE FROM Table_V2 WHERE CNT IS NOT NULL AND ROWID NOT IN ( SELECT MAX (ROWID) FROM Table_V2 WHERE CNT IS NOT NULL GROUP BY COL1, COL2);

0 голосов
/ 24 августа 2018

, если вы хотите сохранить самый последний rowid

вы можете использовать NOT IN для группы max (rowid) по всем столбцам

  DELETE FROM TABLE_NAME 
  WHERE ROWID NOT IN 
  (SELECT
  MAX(ROWID)
  FROM TABLE_NAME
  WHERE...
  GROUP BY COLUMN_NAME_1, COLUMN_NAME_2, etc. )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...