Thursday, March 24, 2005

Memeriksa tabel apakah ada duplikasi data atau tidak.

Pernahkah Anda perlu memeriksa tabel Anda; apakah di tabel itu (field tertentu) ada duplikasi data atau tidak? Kalau pernah, apa cara yang Anda gunakan? Berikut ini adalah skeleton dari simple query yang menampilkan duplikasi data yang ada di field pada tabel tertentu:


SELECT c_name, c_address, c_city
FROM customer
WHERE c_name IN
(SELECT c_name FROM customer GROUP BY c_name HAVING COUNT(*) > 1)


Catatan: kalau Anda menggunakan native vfp, jangan lupa menyertakan tanda titik koma untuk menyambung expresi antar baris.

Query di atas akan menampilkan nama, alamat, dan kota dari customer yang nama-nya ada lebih dari dua di data customer. Untuk memodifikasi sesuai dengan kebutuhan Anda, Anda bisa perhatikan frame berikut:

SELECT {field1}, {field2}, {field3}, ...
FROM {tabel}
WHERE {field_X} IN
(SELECT {field_X} FROM {tabel} GROUP BY {field_X} HAVING COUNT(*) > 1)


dimana {field_X} adalah nama field yang ingin dicari kemungkinan ada/tidak duplikasi data.

Mudah-mudahan bisa membantu menambah wawasan!

Foxy

4 comments:

Anonymous said...

Thank mas foxy... ada ilmu baru lagi nih...
biasanya saya kalau ngecek data yang ada duplikasinya cuma pake perintah sql seperti ini:

SELECT Dsiswa.pelajaran, count(*);
FROM siswa!dsiswa;
GROUP BY Dsiswa.pelajaran;
HAVING count(*) <> 1

Foxy said...

Anonim: (if you don't mind, please put your name)

Your query:
SELECT Dsiswa.pelajaran, count(*);
FROM siswa!dsiswa;
GROUP BY Dsiswa.pelajaran;
HAVING count(*) <> 1
Yup. Cara ini bisa dipakai kalau Anda hanya perlu menampilkan field yang ada duplikasinya. Kenapa? Okay. Coba pikirkan kasus ini. Gimana kalau selain field yang ada duplikasinya (dalam kasus query Anda; field pelajaran), Anda juga ingin melihat field lainnya (misal ada field nama dan kelas). Kalau Anda berikan query:
SELECT Dsiswa.pelajaran, count(*), nama, kelas ;
FROM siswa!dsiswa;
GROUP BY Dsiswa.pelajaran;
HAVING count(*) <> 1
Maka di VFP8/9 tanpa SET ENGINEBEHAVIOUR 70 atau SQL Server (atau RDBMS lain yang menggunakan standard ANSI92), query Anda akan ditolak karena kolom nama dan kelas tidak ada di klausa GROUP BY. Jadi, supaya valid, query Anda harus:
SELECT Dsiswa.pelajaran, count(*), nama, kelas ;
FROM siswa!dsiswa;
GROUP BY Dsiswa.pelajaran, nama, kelas ;
HAVING count(*) <> 1
Tapi dengan begini arti dari query Anda sudah berbeda, karena yang Anda cari menjadi row dengan duplikasi kolom pelajaran, nama, dan kelas -- padahal sebenarnya yang Anda cari hanya yang duplikasi pelajaran saja.
Karena itu di tips yang saya berikan, saya memisahkan grouping duplikasi dengan klausa SELECT utama.

Good thinking though! :) And thanks for your comment!

Foxy

Anonymous said...

Thanks Mr. Foxy Land, anda sudah bermurah hati membagikan ilmu anda, argumen anda benar, krn dulu sy pernah mengalami hal yg serupa. persis spt yg diuraikan.

Anonymous said...

Meiner Meinung nach ist es das sehr interessante Thema. Ich biete Ihnen es an, hier oder in PM zu besprechen. levitra generika viagra [url=http//t7-isis.org]viagra generika[/url]