Удаление дубликатов строк из оракула - PullRequest
0 голосов
/ 03 марта 2012

Я использую базу данных oracle. Я хочу использовать дубликаты строк из таблицы, кроме одной, что означает, что я хочу удалить все строки, но должна быть хотя бы одна строка.У меня есть таблица

employee_id ---- department_id
1                     10
2                     10
1                     20
3                     30
2                     30

Теперь я хочу удалить повторяющиеся строки, но должна быть хотя бы одна строка.

select count(employee_id),employee_id 
from employee
group by employee_id
having count(employee_id) >1));

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

удалить из empl, где eno IN (выберите eno из (выберите count (eno), eno из группы empl, если eno имеет count (eno)> 1));

РЕДАКТИРОВАТЬ: Я хочу сохранить employee_id Любой, кто может вести меня дальше

Ответы [ 3 ]

3 голосов
/ 03 марта 2012
delete from employee a
where employee_id in (
   select employee_id 
   from employee b
   where b.department_id > a.department_id )
2 голосов
/ 19 марта 2012

Использование подзапроса для удаления дублирующихся строк

Здесь мы видим пример использования SQL для удаления дублирующихся строк таблицы с использованием SQL-запроса для определения дублирующихся строк с указанием вручную столбцов соединения:

DELETE FROM
   table_name A
WHERE
  a.rowid >
   ANY (
     SELECT
        B.rowid
     FROM
        table_name B
     WHERE
        A.col1 = B.col1
     AND
        A.col2 = B.col2
        );

Использование RANK для удаления дублирующихся строк

Это пример функции RANK для идентификации и удаления дублирующихся строк из таблиц Oracle, которая удаляет все дублирующиеся строки, оставляя первоначальный экземпляр дублирующейся строки:

delete from $table_name where rowid in
  (
  select "rowid" from
     (select "rowid", rank_n from
         (select rank() over (partition by $primary_key order by rowid) rank_n, rowid as "rowid"
             from $table_name
             where $primary_key in
                (select $primary_key from $table_name
                  group by $all_columns
                  having count(*) > 1
                )
             )
         )
     where rank_n > 1
  )

Одной из наиболее важных функций Oracle является возможность обнаруживать и удалять повторяющиеся строки из таблицы.В то время как многие Oracle DBA накладывают ограничения ссылочной целостности первичного ключа на таблицу, поиск дубликатов файлов многие магазины не используют RI, поскольку им нужна гибкость.

0 голосов
/ 01 июня 2017

УДАЛИТЬ ИЗ ИМЕН ГДЕ ROWID> (ВЫБЕРИТЕ МИН (ROWID) ИЗ ИМЕН b) ГДЕ b.name = a.name AND b.age = a.age

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