आइए पहले एक टेबल बनाते हैं:
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(100) );
Query OK, 0 rows affected (0.46 sec)
इन्सर्ट कमांड का उपयोग करके टेबल में कुछ रिकॉर्ड डालें:
mysql> insert into DemoTable(FirstName) values('Chris');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.09 sec)
सेलेक्ट स्टेटमेंट का उपयोग करके टेबल से सभी रिकॉर्ड प्रदर्शित करें:
mysql> select * from DemoTable;
यह निम्नलिखिक आउटपुट देगा:
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 3 | Robert | | 4 | John | | 5 | John | | 6 | Mike | +----+-----------+ 6 rows in set (0.00 sec)
MySQL टेबल से डुप्लिकेट मान हटाने की क्वेरी (LEFT JOIN)
mysql> delete tbl from DemoTable tbl left join(
select min(Id) as Id, FirstName
from DemoTable
group by FirstName
) tbl1 ON tbl.Id = tbl1.Id AND tbl.FirstName = tbl1.FirstName
where tbl1.Id IS NULL;
Query OK, 2 rows affected (0.16 sec)
आइए टेबल रिकॉर्ड एक बार फिर जांचें।
mysql> select * from DemoTable;
यह निम्नलिखिक आउटपुट देगा:
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 4 | John | | 6 | Mike | +----+-----------+ 4 rows in set (0.00 sec)
व्याख्या
- सबक्वेरी प्रत्येक FirstName के लिए न्यूनतम Id ढूंढती है (पहली घटना रखें)
LEFT JOINमूल टेबल को इस परिणाम से जोड़ता हैWHERE tbl1.Id IS NULLवे पंक्तियाँ ढूंढता है जिनका मिलान नहीं हुआ (डुप्लिकेट)- उन पंक्तियों को हटा दिया जाता है, प्रत्येक नाम की पहली घटना बनी रहती है
सरल विकल्प (MySQL 8.0+)
DELETE FROM DemoTable WHERE Id NOT IN ( SELECT MIN(Id) FROM DemoTable GROUP BY FirstName );
या ROW_NUMBER() के साथ (8.0+)
WITH cte AS ( SELECT Id, ROW_NUMBER() OVER (PARTITION BY FirstName ORDER BY Id) as rn FROM DemoTable ) DELETE FROM DemoTable WHERE Id IN (SELECT Id FROM cte WHERE rn > 1);