Menghapus data duplikat didalam table
Kita bisa gunakan cara dengan menampung semua
informasi yang duplicate ke temporary data dengan terlebih dahulu menjumlahkan
value yang ada, lalu kemudian data yang duplikat di table kita delete. Setelah
itu data dari table temporary tadi dimasukkan ke dalam table, sehingga sekarang
di table tidak terdapat informasi yang duplikat lagi.
Perlu diingat ketika kita menghapus sebuah row maka
kita akan kehilangan informasi yang mungkin kita butuhkan. Jika column yang ada
hanya berupa 3 column dan informasinya termasuk key field saja maka tidak akan
ada masalah. Yang menjadi masalah adalah ketika ada field lain yang berpengaruh
seperti pada contoh yang saya buat adalah field value ketika kita menghapus data
yang duplikat tetapi nilai field valuenya berbeda kita akan kehilangan informasi
dari field value tersebut.
Karenanya hendaknya informasi penting selain key
tidak menjadi hilang dikarenakan key duplikat. Pada contoh dibawah saya
menjumlahkan terlebih dahulu field value untuk setiap data yang duplikat dan
disimpan ke temptable, untuk seterusnya dimasukkan kembali ke Mytable dengan
nilai field value yang sudah di SUM.
Berikut Contoh Scrip untuk menghilangkan duplicate
data (silahkan di copy paste di Query analyser)
-------------------------- Begin Script
-----------------------------
--Create Table MyTable
CREATE TABLE [dbo].[MyTable](
[FieldA] [nchar](10) COLLATE
SQL_Latin1_General_CP1_CI_AS NOT NULL,
[FieldB] [nchar](10) COLLATE
SQL_Latin1_General_CP1_CI_AS NOT NULL,
[FieldC] [nchar](10) COLLATE
SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Value] [int] NULL
) ON [PRIMARY]
--Insert Data to Table
INSERT INTO [dbo].[MyTable]
([FieldA],[FieldB],[FieldC],[Value])
VALUES ('A1','B1','C1',10)
INSERT INTO [dbo].[MyTable]
([FieldA],[FieldB],[FieldC],[Value])
VALUES ('A2','B2','C2',20)
INSERT INTO [dbo].[MyTable]
([FieldA],[FieldB],[FieldC],[Value])
VALUES ('A3','B3','C3',30)
INSERT INTO [dbo].[MyTable]
([FieldA],[FieldB],[FieldC],[Value])
VALUES ('A3','B3','C3',40)
INSERT INTO [dbo].[MyTable]
([FieldA],[FieldB],[FieldC],[Value])
VALUES ('A4','B4','C4',50)
INSERT INTO [dbo].[MyTable]
([FieldA],[FieldB],[FieldC],[Value])
VALUES ('A4','B4','C4',60)
-- Display All MyTable Data
Select * from [MyTable]
--Copy All Duplicate Data To #TempTable Table and Sum
the Duplicate value
Select FieldA,Fieldb,FieldC,Sum(Value) as Value into
#TempTable
from [MyTable]
where cast(FieldA as nvarchar(5)) +
cast(FieldB as nvarchar(5)) +
cast(FieldC as nvarchar(5))
in (
select
cast(FieldA as nvarchar(5)) +
cast(FieldB as nvarchar(5)) +
cast(FieldC as nvarchar(5))
from [MyTable]
group by FieldA, FieldB, FieldC
having count(
cast(FieldA as nvarchar(5)) +
cast(FieldB as nvarchar(5)) +
cast(FieldC as nvarchar(5)))>1)
Group by FieldA,Fieldb,FieldC
--Display All temptable data
select * from #TempTable
--Delete All Duplicate data in MyTable
Delete from [MyTable]
where cast(FieldA as nvarchar(5)) +
cast(FieldB as nvarchar(5)) +
cast(FieldC as nvarchar(5))
in (
select distinct
cast(FieldA as nvarchar(5)) +
cast(FieldB as nvarchar(5)) +
cast(FieldC as nvarchar(5))
from [MyTable]
group by FieldA, FieldB, FieldC
having count(cast(FieldA as nvarchar(5)) +
cast(FieldB as nvarchar(5)) +
cast(FieldC as nvarchar(5)))>1)
--Insert Data from Temptable to MyTable
insert into [MyTable] Select
FieldA,Fieldb,FieldC,Value from #TempTable
--Display All MyTable Data
select * from [MyTable]
-- Drop All Table
drop table [MyTable]
drop table #TempTable
------------------------ End Script
----------------------------