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