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

SQLite में प्राथमिक कुंजी को अनदेखा करते हुए डुप्लिकेट पंक्तियों को खोजने के 11 तरीके

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 . को छोड़कर) कॉलम, जो तालिका की प्राथमिक कुंजी है, और इसमें सभी पंक्तियों में एक अद्वितीय मान होता है)। अंतिम तीन पंक्तियाँ भी डुप्लीकेट हैं (DogId . को छोड़कर) कॉलम)।

प्राथमिक कुंजी कॉलम सुनिश्चित करता है कि कोई डुप्लिकेट पंक्तियाँ नहीं हैं, जो कि RDBMS में अच्छा अभ्यास है, क्योंकि प्राथमिक कुंजी डेटा अखंडता को लागू करने में मदद करती है। लेकिन चूंकि प्राथमिक कुंजियाँ डुप्लिकेट पंक्तियों को रोकती हैं, इसलिए उनमें डुप्लिकेट खोजने की हमारी क्षमता में हस्तक्षेप करने की क्षमता होती है।

ऊपर हमारी तालिका में, प्राथमिक कुंजी कॉलम एक वृद्धिशील संख्या है, और इसका मान कोई अर्थ नहीं रखता है और यह महत्वपूर्ण नहीं है। इसलिए यदि हम दूसरे कॉलम में डुप्लीकेट ढूंढना चाहते हैं तो हमें उस पंक्ति को अनदेखा करना होगा।

विकल्प 1

हम GROUP BY . के साथ एक क्वेरी चला सकते हैं कॉलम को उनके महत्वपूर्ण कॉलम के आधार पर समूहित करने के लिए क्लॉज करें, फिर COUNT() . का उपयोग करें समान पंक्तियों की संख्या वापस करने के लिए कार्य:

SELECT 
    FirstName, 
    LastName, 
    COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName, LastName
ORDER BY Count DESC;

परिणाम:

FirstName  LastName  Count
---------  --------  -----
Wag        Johnson   3    
Bark       Smith     2    
Ruff       Robinson  1    
Woof       Jones     1    

यहां हमने प्राथमिक कुंजी कॉलम को अपनी क्वेरी से हटाकर बाहर कर दिया है। हमने इसे अवरोही क्रम में गिनती के आधार पर भी आदेश दिया, ताकि डुप्लिकेट पहले दिखाई दें।

परिणाम हमें बताता है कि वैग जॉनसन वाली तीन पंक्तियाँ और बार्क स्मिथ वाली दो पंक्तियाँ हैं। ये डुप्लीकेट हैं (या वैग जॉनसन के मामले में तीन प्रतियों में)। अन्य दो पंक्तियों में कोई डुप्लीकेट नहीं है।

विकल्प 2

हम HAVING . का उपयोग कर सकते हैं गैर-डुप्लिकेट को आउटपुट से बाहर करने के लिए क्लॉज:

SELECT 
    FirstName, 
    LastName, 
    COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName, LastName
HAVING COUNT(*) > 1
ORDER BY Count DESC;

परिणाम:

FirstName  LastName  Count
---------  --------  -----
Wag        Johnson   3    
Bark       Smith     2    

विकल्प 3

समवर्ती स्तंभों पर डुप्लिकेट की जाँच का एक उदाहरण यहां दिया गया है। इस मामले में हम DISTINCT . का उपयोग करते हैं विशिष्ट मान प्राप्त करने के लिए कीवर्ड, फिर COUNT() . का उपयोग करें गिनती वापस करने के लिए कार्य करें:

SELECT
    DISTINCT FirstName || ' ' || LastName AS DogName,
    COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName || ' ' || LastName
ORDER BY Count DESC;

परिणाम:

DogName        Count
-------------  -----
Wag Johnson    3    
Bark Smith     2    
Woof Jones     1    
Ruff Robinson  1    

विकल्प 4

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

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

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

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
2      Bark       Smith   
6      Wag        Johnson 
7      Wag        Johnson 

हम SELECT * . को बदल सकते हैं DELETE के साथ टेबल पर डी-डुपिंग ऑपरेशन करने के लिए।

ध्यान दें कि हम DogId . का उपयोग कर सकते थे rowid . के बजाय कॉलम (हमारी प्राथमिक कुंजी) अगर हम चाहते थे। उस ने कहा, rowid यदि आप किसी कारण से प्राथमिक कुंजी कॉलम का उपयोग नहीं कर सकते हैं, या तालिका में प्राथमिक कुंजी नहीं है, तो यह उपयोगी हो सकता है।

विकल्प 5

यहां एक और क्वेरी है जो rowid . का उपयोग करती है :

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

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
2      Bark       Smith   
6      Wag        Johnson 
7      Wag        Johnson 

पिछले उदाहरण की तरह, हम SELECT * . को बदल सकते हैं DELETE के साथ डुप्लिकेट पंक्तियों को हटाने के लिए।

विकल्प 6

दो rowid यदि आपको अपनी क्वेरी में प्राथमिक कुंजी को पूरी तरह से अनदेखा करना चाहिए (या यदि आपके पास प्राथमिक कुंजी कॉलम बिल्कुल नहीं है) तो उपरोक्त विकल्प बहुत अच्छे हैं। हालांकि जैसा कि बताया गया है, अभी भी rowid . को बदलने का विकल्प है प्राथमिक कुंजी कॉलम के साथ - हमारे मामले में DogId कॉलम:

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

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
2      Bark       Smith   
6      Wag        Johnson 
7      Wag        Johnson 

विकल्प 7

और यहां rowid के साथ अन्य क्वेरी है DogId . द्वारा प्रतिस्थापित किया गया कॉलम:

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

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
2      Bark       Smith   
6      Wag        Johnson 
7      Wag        Johnson 

विकल्प 8

इसे करने का दूसरा तरीका ROW_NUMBER() . का उपयोग करना है विंडो फ़ंक्शन:

SELECT 
    *,
    ROW_NUMBER() OVER ( 
        PARTITION BY FirstName, LastName 
        ORDER BY FirstName, LastName
        ) AS Row_Number
FROM Dogs;

परिणाम:

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

PARTITION का उपयोग करना क्लॉज के परिणामस्वरूप एक नया कॉलम जोड़ा जाता है, जिसमें एक पंक्ति संख्या होती है जो हर बार डुप्लिकेट होने पर बढ़ती है, लेकिन एक अद्वितीय पंक्ति होने पर फिर से रीसेट हो जाती है।

इस मामले में हम परिणामों को समूहीकृत नहीं करते हैं, जिसका अर्थ है कि हम प्रत्येक डुप्लिकेट पंक्ति को उसके विशिष्ट पहचानकर्ता कॉलम सहित देख सकते हैं।

विकल्प 9

हम पिछले उदाहरण का उपयोग एक बड़ी क्वेरी में एक सामान्य तालिका अभिव्यक्ति के रूप में भी कर सकते हैं:

WITH cte AS 
    (
        SELECT 
            *,
            ROW_NUMBER() OVER ( 
                PARTITION BY FirstName, LastName 
                ORDER BY FirstName, LastName
                ) AS Row_Number
        FROM Dogs
    )
SELECT * FROM cte WHERE Row_Number <> 1;

परिणाम:

DogId  FirstName  LastName  Row_Number
-----  ---------  --------  ----------
2      Bark       Smith     2         
6      Wag        Johnson   2         
7      Wag        Johnson   3         

यह आउटपुट से गैर-डुप्लिकेट को बाहर करता है, और यह आउटपुट से प्रत्येक डुप्लिकेट की एक पंक्ति को बाहर करता है।

विकल्प 10

पिछले उदाहरण के समान आउटपुट प्राप्त करने का एक और तरीका यहां दिया गया है:

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

परिणाम:

DogId  FirstName  LastName
-----  ---------  --------
2      Bark       Smith   
6      Wag        Johnson 
7      Wag        Johnson 

विकल्प 11

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

SELECT * 
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
);

परिणाम:

DogId  FirstName  LastName  DogId  FirstName  LastName
-----  ---------  --------  -----  ---------  --------
2      Bark       Smith     1      Bark       Smith   
7      Wag        Johnson   5      Wag        Johnson 
7      Wag        Johnson   6      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 JSON_REMOVE ()

  2. SQLite Ltrim () कैसे काम करता है

  3. टीसीएल मोड में SQLite क्वेरी परिणामों को कैसे प्रारूपित करें

  4. SQLite जाल और नुकसान

  5. sqlite और mysql से डेटा स्पिनर लोड करें