Stergere duplicate dintr-o tabela sql server

Configurare noua (How To)

Situatie

Daca am intr-o tabela dintr-o baza Microsoft sql o inregistrare dublata pe care vreau sa o sterg, poate sa fie un chin aceasta operatie in aparenta banala, daca nu stiu cum sa fac acest lucru.

Solutie

Sa luam un exemplu:
create table test_table
(
Nume varchar(max),
Prenume varchar(max),
DataNastere date,
Sex varchar(1),
LocalitateNastere varchar(max),
LocalitateDomiciliu varchar(max)
)

insert into test_table
values (‘Emil’, ‘Popescu’, ‘20010103’, ‘M’, ‘Poplaca’ , ‘Bucuresti’)

insert into test_table
values (‘George’, ‘Ionescu’, ‘19980103’, ‘M’, ‘Sapanta’ , ‘Bucuresti’)

insert into test_table
values (‘Ionela’, ‘Popescu’, ‘19780103’, ‘F’, ‘Ploiesti’ , ‘Bucuresti’)

insert into test_table
values (‘Emil’, ‘Popescu’, ‘20010103’, ‘M’, ‘Poplaca’ , ‘Bucuresti’)

Vedem ca avem 2 inregistrari identice cu Nume = ‘Emil’
select * from test_table where Nume = ‘Emil’

Mai mult, chiar daca folosesc in where toate coloanele existente in tabela, nu reusesc sa izolez o singura inregistrare, pt ca cele 2 sunt absolut identice:
select * from test_table where Nume = ‘Emil’ and Prenume = ‘Popescu’ and DataNastere = ‘20010103’ and LocalitateNastere = ‘Poplaca’ and LocalitateDomiciliu = ‘Bucuresti’

Drept urmare query-ul de mai jos va sterge ambele inregistrari, si originalul si duplicatul
delete from test_table where Nume = ‘Emil’ and Prenume = ‘Popescu’ and DataNastere = ‘20010103’ and LocalitateNastere = ‘Poplaca’ and LocalitateDomiciliu = ‘Bucuresti’

Exista si solutii mai complicate de a elimina duplicatele si a pastra o singura inregistrare, dar atunci cand am o singura inregistrare duplicata sau cand numarul inregistrarilor duplicate este mic, astfel incat se pot rezolva una cate una, solutia simpla este query-ul de mai jos, care va sterge doar una dintre inregistrarile duplicate:
delete top(1) from test_table where Nume = ‘Emil’ and Prenume = ‘Popescu’ and DataNastere = ‘20010103’ and LocalitateNastere = ‘Poplaca’ and LocalitateDomiciliu = ‘Bucuresti’

La fel si query-ul de mai jos va sterge doar una dintre inregistrarile duplicate, pentru ca trebuie sa retinem ca este important sa izolam cele 2 inregistrari duplicate, iar pentru asta putem folosi in clauza where minimul de atribute necesare, in cazul de fata, Nume:
delete top(1) from test_table where Nume = ‘Emil’

Tip solutie

Permanent
Etichetare:

Voteaza

(11 din 31 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?