PDA

Vollständige Version anzeigen : Rund um das Thema redundante Datensätze


strausto
01.09.2008, 18:46
Ein paar Ansätze um mit doppelten Datensätzen umzugehen.
Wird noch erweitert um SSIS und Collate


TempTabelle löschen, insofern schon existiert:

drop table ##tblDuplicates


TempTabelle erstellen

create table ##tblDuplicates
( col1 int not null identity(1,1),
col2 varchar(50) not null,
col3 int not null
)


Datensätze einfügen

insert ##tblDuplicates values ('A',1)
insert ##tblDuplicates values ('A',1)
insert ##tblDuplicates values ('B',1)
insert ##tblDuplicates values ('B',2)
insert ##tblDuplicates values ('B',3)
insert ##tblDuplicates values ('B',4)
insert ##tblDuplicates values ('C',1)
insert ##tblDuplicates values ('D',1)
insert ##tblDuplicates values ('D',1)


Aufruf der Bespieldaten

select * from ##tblDuplicates


Prüfen der Existenz doppelter Einträge in col2

select
col2,
CountDupl = count(*)
from
##tblDuplicates
group by
col2
having
count(*)>1


Identifikation dieser Datensätze

select
*
from
##tblDuplicates a
join
( select
col2
from
##tblDuplicates
group by
col2
having
count(*)>1
) d
on
a.col2 = d.col2



Eliminierung der doppelten Datensätze (col2 + col3) mit Rank() ab MSSQL2005, wobei jeweils der Datensatz angezeigt wird, deren Rang von col1 am höchsten ist.

select
*
from
##tblDuplicates a
inner join
(
select
col1,
c = rank() over ( PARTITION BY col2,col3 order by col1)
from
##tblDuplicates
) d
on
d.col1 = a.col1
and
d.c = 1


Performante Lösung mit neuer Tabelle

create table ##tblWithOutDuplicates
( col1 int not null identity(1,1),
col2 varchar(50) not null,
col3 int not null
PRIMARY KEY CLUSTERED
(col2,col3)
WITH (IGNORE_DUP_KEY = ON)
)
Go
insert ##tblWithOutDuplicates(col2,col3) select col2,col3 from ##tblDuplicates