Oracle PL / SQL - Как удалить несколько повторяющихся записей в таблице SQL? - PullRequest
3 голосов
/ 23 июня 2011

У меня есть имя таблицы TABLE1, которая содержит дубликаты записей, как показано ниже:

ID  TYPE  AMOUNT NUMBER      DATE
--- ----  ------ ------ ---------
1    AAA   10.00 AAA123 22-JUN-11 
2    AAA    2.00 AAA123 22-JUN-11 
3    AAA   10.00 AAA123 22-JUN-11 
4    AAA    2.00 AAA123 22-JUN-11 
5    AAA   10.00 AAA123 22-JUN-11 
6    AAA    2.00 AAA123 22-JUN-11 
7    AAA   10.00 AAA123 22-JUN-11 
8    AAA    2.00 AAA123 22-JUN-11 
...  ...     ...    ...       ...
100  AAA   10.00 AAA123 22-JUN-11
101  AAA    2.00 AAA123 22-JUN-11

В этом случае я хотел бы удалить ВСЕ строки дублирующихся комбинаций, кроме двух, используя SQL или / через PL / SQL, гдеСУММА (10.00 и 2.00).Кроме того, дубликатов записей, содержащих разные суммы, может быть больше двух, как показано ниже:

ID  TYPE  AMOUNT NUMBER      DATE
--- ----  ------ ------ ---------
1    AAA   10.00 AAA123 22-JUN-11 
2    AAA    2.00 AAA123 22-JUN-11 
3    AAA   15.00 AAA123 22-JUN-11 
4    AAA   25.50 AAA123 22-JUN-11 
5    AAA   10.00 AAA123 22-JUN-11 
6    AAA    2.00 AAA123 22-JUN-11 
7    AAA   15.00 AAA123 22-JUN-11 
8    AAA   25.50 AAA123 22-JUN-11 
...

В приведенном выше примере мне нужно удалить только 4 из 8 записей, где в AMOUNT должно остаться 4 записи(10,00, 2,00, 15,00 и 25,50).Другими словами, у меня есть несколько групп дубликатов в одной таблице (2 записи для одной, 4 для другой и т. Д.) - несколько строк, где существует более одной.

Ответы [ 4 ]

3 голосов
/ 23 июня 2011

Попробуйте это:

DELETE 
    FROM  TABLE1
    WHERE ROWID IN 
    (
        SELECT ROW_ID_VAL
          FROM 
            (
                SELECT a.*, 
                       RANK() OVER(PARTITION BY AMOUNT ORDER BY ID DESC) RN, ROWID row_id_val
                  FROM TABLE1 a
            )
            WHERE rn <> 1
    )
2 голосов
/ 23 июня 2011

Столбец DATE - единственный, который нуждается в дополнительной информации; в противном случае используйте:

DELETE FROM YOUR_TABLE
 WHERE EXISTS (SELECT NULL
                 FROM YOUR_TABLE t
                WHERE t.type = YOUR_TABLE.type
                  AND t.amount = YOUR_TABLE.amount
                  AND t.number = YOUR_TABLE.number
                  AND t.date = YOUR_TABLE.date
             GROUP BY t.type, t.amount, t.number, t.date
               HAVING MIN(t.id) != YOUR_TABLE.id)

Ссылки столбца YOUR_TABLE. относятся к внешнему YOUR_TABLE, таблице, для которой должно быть выполнено удаление. Это дает ему коррелированный эффект подзапроса, но EXISTS не совсем так работает.

1 голос
/ 01 сентября 2014

Один из следующих методов:

Каждый ряд имеет уникальный (row id). Конечно, вы можете определить дублированные строки, а затем удалить дублированные строки на основе (row id). Просто введите следующий оператор SELECT, чтобы увидеть идентификатор дублированных строк:

SELECT rowid from table_name;

0 голосов
/ 01 сентября 2014
DECLARE

BEGIN

  for rec_ in (
                 SELECT type, amount, number, date , count(1) record_count
                    FROM table 1
                  GROUP BY type, amount, number, date
                 HAVING count(1) > 1) loop

      counter_ := 0;

      for rec2_ in ( select * from table1 where rec_.type = type
                                            and rec_.amount = amount
                                            and rec_.number = number
                                            and rec_.date = date) loop

            counter_ := counter_ + 1;            
            exit when counter_ = rec_.record_count;
            delete from table1 where id = rec2_.id;
       End loop;

  end loop;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...