Removing duplicate records by using Oracle’s ROWID

ถ้าคุณมีตารางข้อมูลอยู่ และรู้ว่ามีบางแถวที่มีข้อมูลซ้ำซ้อนกัน ทางไหนเป็นวิธีที่ดีที่จะสามารถหาและกำจัดแถวที่มีข้อมูลซ้ำนี้ออกไปจากตารางของฐานข้อมูล Oracle ?

 

การหาแถวที่มีข้อมูลซ้ำซ้อน

เราสามารถหาข้อมูลแถวที่มีข้อมูลซ้ำซ้อนกันได้โดยใช้คำสั่ง select ดังนี้

 

select a,b,count(*)

from test

group by a,b

having count(*) > 1;

ผลลัพธ์ที่ได้ :

A          B   COUNT(*)

———- ———- ———-

1          2        259

2          2          5

 

จากตัวอย่างในตาราง test นี้เราจะกำหนดว่าให้ค่าในคอลัมภ์ a และ b จะต้องมีค่าไม่ซ้ำ ซึ่งผลลัพธ์ที่ปรากฏคือ มีข้อมูลซ้ำ 258 แถว และ 4 แถว

 

การกำจัดแถวที่มีข้อมูลซ้ำซ้อน
เราสามารถกำจัดแถวที่มีข้อมูลซ้ำซ้อนกันได้โดยการใช้ rowid เข้ามาช่วย คราวนี้คุณต้องเลือกว่าจะเลือกเก็บข้อมูลแถวไหนไว้

เราลองมาดูข้อมูลที่ควรจะเป็นที่ไม่ซ้ำกันว่ามีข้อมูลอะไรบ้าง โดยสามารถใช้คำสั่งได้ดังนี้

select a,b,count(*) from test

group by a,b;

A          B   COUNT(*)

———- ———- ———-

1          2        259

2          2          5

3          0          1

 

กรณีที่ต้องการลบและคงเหลือไว้เฉพาะแถวแรกที่ซ้ำสามารถใช้คำสั่งได้ดังนี้

 

เราต้องการกำจัด 258 แถวที่ซึ่ง A = 1 และ B = 2 บวกกับ

— 4 แถวที่ซึ่ง A = 2 และ B = 2

ลองมา select แถวที่เราจะคงไว้ดูก่อน

select min(rowid),a,b from test

group by a,b;

MIN(ROWID)                             A          B

——————————- ———- ———-

AAAAyvAAGAAAABYAAA          1          2

AAAAyvAAGAAAABYAED          2          2

AAAAyvAAGAAAABYAEI           3          0

 

— คราวนี้ก็ถึงเวลาลบข้อมูลกันแล้ว

— เริ่มกันเลย

delete from test where rowid not in (

select min(rowid) from test group by a,b);

262 rows deleted.

 

— คราวนี้มาตรวจสอบกันว่าข้อมูลที่คงเหลือถูกต้องหรือไม่

select rowid,a,b from test;

ROWID                                      A          B

——————————— ———- ———-

AAAAyvAAGAAAABYAAA          1          2

AAAAyvAAGAAAABYAED          2          2

AAAAyvAAGAAAABYAEI           3          0

 

กรณีที่ต้องการลบและคงเหลือไว้เฉพาะแถวสุดท้ายที่ซ้ำสามารถใช้คำสั่งได้ดังนี้

delete from test where rowid not in (

select max(rowid) from test group by a,b);

262 rows deleted.

 

แต่เพื่อป้องกันการเกิดการซ้ำซ้อนของข้อมูลเหล่านี้ เราสามารถที่จะใช้ unique constraints หรือ primary key ช่วยได้ ปัญหาข้อมูลซ้ำซ้อนแบบนี้ก็จะไม่มีทางเกิดขึ้นให้เกิดความปวดหัวได้อีก

 

Share the Post:

Related Posts

ทำความรู้จักกับ Outlook บนเว็บ

Post Views: 10 Outlook เป็นเครื่องมือจัดการอีเมลและปฏิทินที่ทรงพลัง ซึ่งช่วยให้คุณมีระเบียบและเพิ่มความสามารถในการทำงาน ด้วยอินเทอร์เฟซที่ใช้งานง่าย คุณสามารถจัดการกล่องขาเข้าของคุณ นัดหมาย และทำงานร่วมกับเพื่อนร่วมงานได้อย่างง่ายดาย ฟีเจอร์ที่แข็งแกร่งของ Outlook รวมถึงแม่แบบอีเมลที่ปรับแต่งได้ ความสามารถในการค้นหาขั้นสูง และการผสานรวมที่ไร้รอยต่อกับแอปพลิเคชัน Microsoft Office อื่นๆ ไม่ว่าคุณจะเป็นมืออาชีพที่ยุ่งอยู่หรือเป็นนักเรียนที่ต้องจัดการกับภารกิจหลายอย่าง Outlook

Read More

[บันทึกกันลืม] JupyterHub Authenticated with OIDC

Post Views: 39 ต่อจากตอนที่แล้ว [บันทึกกันลืม] JupyterHub ด้วย Docker คราวนี้ ถ้าต้องการให้ ยืนยันตัวตนด้วย OpenID เช่น PSU Passport เป็นต้น ก็ให้ทำดังนี้ ในไฟล์ jupyterhub_config.py ใส่

Read More