Удалить дубликаты записей из таблицы SQL без первичного ключа - PullRequest
49 голосов
/ 12 июня 2009

У меня есть таблица ниже с записями ниже

create table employee
(
 EmpId number,
 EmpName varchar2(10),
 EmpSSN varchar2(11)
);

insert into employee values(1, 'Jack', '555-55-5555');
insert into employee values (2, 'Joe', '555-56-5555');
insert into employee values (3, 'Fred', '555-57-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');
insert into employee values (1, 'Jack', '555-55-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6 ,'Lisa', '555-70-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');

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

Пример: Emp id 5

Может ли кто-нибудь помочь мне создать запрос на удаление этих дубликатов записей? 1008 *

Заранее спасибо

Ответы [ 18 ]

0 голосов
/ 19 июля 2014

Наличие таблицы базы данных без первичного ключа на самом деле и скажет очень ПЛОХАЯ ПРАКТИКА ... поэтому после добавления одной (ALTER TABLE)

Запускайте это до тех пор, пока вы не увидите больше дублированных записей (в этом и заключается цель подсчета чисел)

DELETE FROM [TABLE_NAME] WHERE [Id] IN 
(
    SELECT MAX([Id])
    FROM [TABLE_NAME]
    GROUP BY [TARGET_COLUMN]
    HAVING COUNT(*) > 1
)


SELECT MAX([Id]),[TABLE_NAME], COUNT(*) AS dupeCount
FROM [TABLE_NAME]
GROUP BY [TABLE_NAME]
HAVING COUNT(*) > 1

MAX ([Id]) приведет к удалению последних записей (тех, которые были добавлены после первого создания), если вы хотите противоположное значение, что в случае необходимости удаления первых записей и оставления последней записи, используйте MIN ([Id] )

0 голосов
/ 18 июня 2013

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

DELETE FROM dbo.tbl1
WHERE id NOT IN (
     Select MIN(Id) AS namecount FROM tbl1
     GROUP BY Name
)
0 голосов
/ 14 апреля 2013

нет ID, нет rowcount() или нет temp table необходимо ....

WHILE 
  (
     SELECT  COUNT(*) 
     FROM TBLEMP  
     WHERE EMPNO 
            IN (SELECT empno  from tblemp group by empno having count(empno)>1)) > 1 


DELETE top(1)  
FROM TBLEMP 
WHERE EMPNO IN (SELECT empno  from tblemp group by empno having count(empno)>1)
0 голосов
/ 06 октября 2009
select t1.* from employee t1, employee t2 where t1.empid=t2.empid and t1.empname = t2.empname and t1.salary = t2.salary
group by t1.empid, t1.empname,t1.salary having count(*) > 1
0 голосов
/ 12 июня 2009

Я не эксперт по SQL, поэтому терпите меня. Я уверен, что вы получите лучший ответ достаточно скоро. Вот как вы можете найти дубликаты записей.

select t1.empid, t1.empssn, count(*)
from employee as t1 
inner join employee as t2 on (t1.empid=t2.empid and t1.empssn = t2.empssn)
group by t1.empid, t1.empssn
having count(*) > 1

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

0 голосов
/ 09 ноября 2010
DELETE FROM 'test' 
USING 'test' , 'test' as vtable
WHERE test.id>vtable.id and test.common_column=vtable.common_column  

Используя это мы можем удалить дубликаты записей

0 голосов
/ 09 ноября 2010
ALTER IGNORE TABLE test
           ADD UNIQUE INDEX 'test' ('b'); 

@ здесь 'b' - это имя столбца уникальности, @ здесь 'test' - это индексное имя.

0 голосов
/ 16 июля 2010
create unique clustered index Employee_idx
on Employee ( EmpId,EmpSSN )
with ignore_dup_key

Вы можете удалить индекс, если он вам не нужен.

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