SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

SQLite में प्राथमिक कुंजी वाली डुप्लिकेट पंक्तियों को हटाने के 6 तरीके

नीचे छह उदाहरण हैं जो SQLite में किसी तालिका से डुप्लिकेट पंक्तियों को हटाते हैं जब उन पंक्तियों में प्राथमिक कुंजी या अद्वितीय पहचानकर्ता कॉलम होता है।

इन उदाहरणों में, डुप्लिकेट की तुलना करते समय प्राथमिक कुंजी को अनदेखा किया जाना चाहिए (इस तथ्य के कारण कि प्राथमिक कुंजी परिभाषा के अनुसार डुप्लिकेट पंक्तियों को रोकती है)।

नमूना डेटा

हमारे उदाहरण निम्नलिखित डेटा का उपयोग करते हैं:

SELECT * FROM Dogs;

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
1      Bark       Smith   
2      Bark       Smith   
3      Woof       Jones   
4      Ruff       Robinson
5      Wag        Johnson 
6      Wag        Johnson 
7      Wag        Johnson 

हम देख सकते हैं कि पहली दो पंक्तियों में डुप्लीकेट हैं, जैसा कि अंतिम तीन पंक्तियों में होता है।

DogId कॉलम अद्वितीय मान रखता है (क्योंकि यह तालिका की प्राथमिक कुंजी है), और इसलिए, कड़ाई से बोलते हुए, कोई डुप्लिकेट नहीं हैं। लेकिन वास्तविक जीवन स्थितियों में, आप अक्सर उन तालिकाओं को डी-डुप्लिकेट करना चाहेंगे जिनमें प्राथमिक कुंजी होती है। इसलिए, निम्नलिखित उदाहरणों में हम प्राथमिक कुंजी को अनदेखा करते हैं और उन पंक्तियों को हटा देते हैं जिनमें शेष स्तंभों में डुप्लिकेट मान होते हैं।

विकल्प 1

उपरोक्त तालिका को डी-डुप्लिकेट करने के लिए हमारा पहला विकल्प यहां दिया गया है:

DELETE FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

SELECT * FROM Dogs;

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
1      Bark       Smith   
3      Woof       Jones   
4      Ruff       Robinson
5      Wag        Johnson 

तालिका को अपेक्षित रूप से डी-डुप्लिकेट किया गया है।

हम वैकल्पिक रूप से MAX() . का उपयोग कर सकते हैं MIN() . के बजाय फ़ंक्शन यह बदलने के लिए कार्य करता है कि कौन सी पंक्तियां हटा दी गई हैं। मैं इसे अगले उदाहरण में करूँगा।

विकल्प 2

इस उदाहरण (और निम्नलिखित उदाहरणों) में हम मान लेंगे कि तालिका को उसकी मूल स्थिति (डुप्लिकेट के साथ) में पुनर्स्थापित कर दिया गया है।

यहां एक और क्वेरी है जो डुप्लिकेट पंक्तियों को हटाती है और शेष पंक्तियों का चयन करती है:

DELETE FROM Dogs WHERE DogId IN (
    SELECT d2.DogId 
    FROM Dogs d1, Dogs d2 
    WHERE d1.FirstName = d2.FirstName 
    AND d1.LastName = d2.LastName 
    AND d1.DogId <> d2.DogId 
    AND d1.DogId=( 
        SELECT MAX(DogId) 
        FROM Dogs d3 
        WHERE d3.FirstName = d1.FirstName 
        AND d3.LastName = d1.LastName
    )
);

SELECT * FROM Dogs;

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
2      Bark       Smith   
3      Woof       Jones   
4      Ruff       Robinson
7      Wag        Johnson 

तालिका को अब डी-डुप्लिकेट कर दिया गया है।

ध्यान दें कि मैंने MAX() . का उपयोग किया है MIN() . के बजाय फ़ंक्शन जिसका मैंने पिछले उदाहरण में उपयोग किया था। हम डी-डुपिंग ऑपरेशन पर इसका असर देख सकते हैं। इसने तालिका से विभिन्न पंक्तियों को हटा दिया।

विकल्प 3

यहां एक विकल्प दिया गया है जिसके लिए MIN() . के उपयोग की आवश्यकता नहीं है या MAX() :

DELETE FROM Dogs
WHERE EXISTS (
  SELECT 1 FROM Dogs d2 
  WHERE Dogs.FirstName = d2.FirstName
  AND Dogs.LastName = d2.LastName
  AND Dogs.DogId > d2.DogId
);

SELECT * FROM Dogs;

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
1      Bark       Smith   
3      Woof       Jones   
4      Ruff       Robinson
5      Wag        Johnson 

विकल्प 4

यहाँ एक और विकल्प है:

DELETE FROM Dogs
WHERE DogId > (
  SELECT MIN(DogId) FROM Dogs d2  
  WHERE Dogs.FirstName = d2.FirstName
  AND Dogs.LastName = d2.LastName
);

SELECT * FROM Dogs;

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
1      Bark       Smith   
3      Woof       Jones   
4      Ruff       Robinson
5      Wag        Johnson 

विकल्प 5

डिफ़ॉल्ट रूप से, SQLite में प्रत्येक पंक्ति में एक विशेष कॉलम होता है, जिसे आमतौर पर rowid . कहा जाता है , जो विशिष्ट रूप से तालिका के भीतर उस पंक्ति की पहचान करता है। जब तक इसे तालिका से स्पष्ट रूप से हटाया नहीं गया है, आप इसे प्रत्येक पंक्ति के लिए एक अद्वितीय पहचानकर्ता के रूप में उपयोग कर सकते हैं। यदि आप किसी कारण से प्राथमिक कुंजी को संदर्भित करने में असमर्थ हैं (या यदि तालिका में प्राथमिक कुंजी नहीं है) तो यह विधि उपयोगी हो सकती है।

इसलिए हम rowid . का उपयोग कर सकते हैं DogId . के बजाय हमारी क्वेरी में कॉलम:

DELETE FROM Dogs
WHERE EXISTS (
  SELECT 1 FROM Dogs d2 
  WHERE Dogs.FirstName = d2.FirstName
  AND Dogs.LastName = d2.LastName
  AND Dogs.rowid > d2.rowid
);

SELECT * FROM Dogs;

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
1      Bark       Smith   
3      Woof       Jones   
4      Ruff       Robinson
5      Wag        Johnson 

विकल्प 6

और यहां दूसरा उदाहरण है, लेकिन rowid . के साथ प्राथमिक कुंजी के बजाय:

DELETE FROM Dogs
WHERE rowid > (
  SELECT MIN(rowid) FROM Dogs d2  
  WHERE Dogs.FirstName = d2.FirstName
  AND Dogs.LastName = d2.LastName
);

SELECT * FROM Dogs;

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
1      Bark       Smith   
3      Woof       Jones   
4      Ruff       Robinson
5      Wag        Johnson 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite डेटाबेस में वीडियो सामग्री को कैसे स्टोर करें (वीडियो पथ नहीं)

  2. आयात पहले से ही बनाया sqlite डेटाबेस (xamarin)

  3. एक टेबल के लिए रूम एंटिटी बनाएं जिसमें स्क्लाइट में लंबी डेटाटाइप वाला फ़ील्ड हो

  4. एंड्रॉइड में एसक्लाइट डेटाबेस का उपयोग करके टेबल कैसे बनाएं?

  5. कैसे जूलियनडे () फ़ंक्शन SQLite में काम करता है