सेल्फ-जॉइन के साथ DELETE से डुप्लीकेट हटाएं
डुप्लीकेट मान वाली पंक्तियों में से केवल एक रखकर बाकी हटाने के लिए सेल्फ-जॉइन के साथ DELETE स्टेटमेंट का उपयोग करें।
टेबल और डेटा
mysql> CREATE TABLE DemoTable (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(40)
);
mysql> INSERT INTO DemoTable(StudentName) VALUES('John'), ('Carol'), ('Sam'), ('Carol'), ('David'), ('Carol');
मूल डेटा (Carol 3 बार)
mysql> SELECT * FROM DemoTable;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1 | John |
| 2 | Carol |
| 3 | Sam |
| 4 | Carol |
| 5 | David |
| 6 | Carol |
+-----------+-------------+
डुप्लीकेट हटाने की क्वेरी
mysql> DELETE tbl1 FROM DemoTable tbl1, DemoTable tbl2
-> WHERE tbl1.StudentName = tbl2.StudentName
-> AND tbl1.StudentId > tbl2.StudentId;
Query OK, 2 rows affected (0.79 sec)
परिणाम (Carol का केवल पहला रिकॉर्ड बचा)
mysql> SELECT * FROM DemoTable;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1 | John |
| 2 | Carol |
| 3 | Sam |
| 5 | David |
+-----------+-------------+
कैसे काम करता है
- टेबल को स्वयं से जॉइन करता है (
tbl1औरtbl2) - समान नाम वाली पंक्तियां मिलाता है
tbl1.StudentId > tbl2.StudentId- बड़ी ID वाली पंक्ति को हटाता है (पहली/सबसे छोटी ID बचती है)
आधुनिक विकल्प (MySQL 8.0+)
-- ROW_NUMBER() विंडो फ़ंक्शन के साथ
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY StudentName ORDER BY StudentId) AS rn
FROM DemoTable
)
DELETE FROM DemoTable WHERE StudentId IN (
SELECT StudentId FROM ranked WHERE rn > 1
);
रोकथाम: UNIQUE कंस्ट्रेंट
ALTER TABLE DemoTable ADD UNIQUE KEY unique_name (StudentName);