การลบแถวซ้ำ (Duplicate Rows) ด้วย Self-JOIN
ใช้ DELETE กับ INNER JOIN ตารางตัวเอง (Self-Join) เปรียบเทียบ Primary Key เพื่อเก็บแถวใดแถวหนึ่ง
คำสั่ง
DELETE tbl1
FROM demo14 tbl1
INNER JOIN demo14 tbl2
WHERE tbl1.id < tbl2.id
AND tbl1.name = tbl2.name;
ตัวอย่างข้อมูลก่อนลบ
| id | name |
|---|---|
| 1 | John |
| 2 | David |
| 3 | David |
| 4 | Bob |
| 5 | John |
| 6 | Carol |
ผลลัพธ์หลังลบ
| id | name |
|---|---|
| 3 | David |
| 4 | Bob |
| 5 | John |
| 6 | Carol |
ตรรกะ: tbl1.id < tbl2.id หมายถึง ลบแถวที่ ID น้อยกว่า (เก่ากว่า) ทิ้ง ไปเก็บแถว ID มากกว่า (ใหม่กว่า)
วิธีอื่น:
- MySQL 8.0+:
DELETE FROM demo14 WHERE id NOT IN (SELECT MAX(id) FROM demo14 GROUP BY name) - สร้าง Unique Index ชั่วคราว แล้ว
INSERT IGNORE ... SELECT DISTINCTเข้าตารางใหม่