2012-09-02 9 views
29

मैं इस तरह 3 कॉलम युक्त तालिका है। उनमें से कुछ state हैं और कुछ अन्य नहीं हैं। अब, इन अभिलेखों की कल्पना करें:SQL में केवल एक फ़ील्ड पर डुप्लिकेट किए बिना रिकॉर्ड का चयन कैसे करें?</p> <pre><code>+------------+---------------+-------+ | Country_id | country_title | State | +------------+---------------+-------+ </code></pre> <p>इस तालिका में कई रिकॉर्ड हैं:

1 | Canada | Alberta 
2 | Canada | British Columbia 
3 | Canada | Manitoba 
4 | China | 

मुझे बिना किसी डुप्लिकेट के देश के नाम होने की आवश्यकता है। असल में मुझे उनके id और title की आवश्यकता है, इसे बनाने के लिए सबसे अच्छा SQL कमांड क्या है? मैंने नीचे दिए गए फॉर्म में DISTINCT का उपयोग किया लेकिन मैं एक उचित परिणाम प्राप्त नहीं कर सका।

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title 

मेरे वांछित परिणाम कुछ इस तरह है: मेरे लिए

1, Canada 
4, China 
+1

क्या आर प्रयास करें आप जिस प्रश्न की कोशिश की थी, उससे आप क्या चाहते थे, और आप जो चाहते हैं उससे अलग कैसे होते हैं? –

+0

मुझे कनाडा के कई रिकॉर्ड के साथ एक परिणाम सेट मिल रहा है। –

+0

इसके बजाय आप क्या करना चाहते हैं? क्या आप दिखा सकते हैं कि आपका वांछित परिणाम सेट क्या है। इसे स्पष्ट करें। इसके द्वारा मेरा मतलब यह नहीं है कि आप अपने शब्दों में जो चाहते हैं उसका वर्णन न करें। अपने प्रश्न को अपडेट करें * सटीक * परिणाम जो आपको मिलते हैं और * सटीक * परिणाम जो आप चाहते हैं, टैब्यूलर प्रारूप में, और स्पष्ट और सटीक तरीके से दिखाते हैं। –

उत्तर

58

इस प्रयास करें:

SELECT MIN(id) AS id, title 
FROM tbl_countries 
GROUP BY title 
23

DISTINCT कीवर्ड
है आपकी क्वेरी सही है

बस करने की कोशिश यह पहली

SELECT DISTINCT title,id FROM tbl_countries 

बाद में आप ऑर्डर के साथ प्रयास कर सकते हैं।

+4

क्वेरी के परिणाम सिर्फ 'राज्य' कॉलम को हटा देंगे, और ऐसा नहीं है कि ओपी की जरूरत है;)। –

+1

ओपी ने पहले से ही यह कोशिश की है, यह सही नहीं है ... – ChihHao

+0

यह केवल यह सुनिश्चित करता है कि प्रत्येक परिणामस्वरूप ट्यूपल क्वेरी से अद्वितीय है, न कि कॉलम में प्रत्येक मान अद्वितीय है। – Jodo1992

10

DISTINCT कीवर्ड का उपयोग के लिए, आप इसे इस तरह उपयोग कर सकते हैं:

SELECT DISTINCT 
    (SELECT min(ti.Country_id) 
    FROM tbl_countries ti 
    WHERE t.country_title = ti.country_title) As Country_id 
    , country_title 
FROM 
    tbl_countries t 

ROW_NUMBER() का उपयोग कर के लिए, आप इसे इस तरह उपयोग कर सकते हैं:

SELECT 
    Country_id, country_title 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY country_title ORDER BY Country_id) As rn 
    FROM tbl_countries) t 
WHERE rn = 1 

इसके अलावा LEFT JOIN उपयोग करने के साथ, आप इसका उपयोग कर सकते हैं:

SELECT t1.Country_id, t1.country_title 
FROM tbl_countries t1 
    LEFT OUTER JOIN 
    tbl_countries t2 ON t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id 
WHERE 
    t2.country_title IS NULL 

और EXISTS का उपयोग करने के साथ, आप की कोशिश कर सकते हैं:

SELECT t1.Country_id, t1.country_title 
FROM tbl_countries t1 
WHERE 
    NOT EXISTS (SELECT * 
       FROM tbl_countries t2 
       WHERE t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id) 
0

MySQL में एक विशेष स्तंभ समारोह group_concat हो सकता है प्रयुक्त:

SELECT GROUP_CONCAT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'computers' AND 
    TABLE_NAME='Laptop' AND 
    COLUMN_NAME NOT IN ('code') 
ORDER BY ORDINAL_POSITION; 

यह उल्लेख किया जाना चाहिए कि MySQL में सूचना स्कीमा सभी डेटाबेस सर्वर को कवर करता है, कुछ डेटाबेस नहीं। यही कारण है कि यदि विभिन्न डेटाबेस में समान नाम वाले टेबल होते हैं, तो WHERE खंड की खोज स्थिति को स्कीमा नाम निर्दिष्ट करना चाहिए: TABLE_SCHEMA = 'कंप्यूटर'।

स्ट्रिंग्स को MySQL में CONCAT फ़ंक्शन के साथ संयोजित किया जाता है।हमारी समस्या का अंतिम समाधान .. के रूप में

SELECT CONCAT('SELECT ', 
(SELECT GROUP_CONCAT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA='computers' AND 
    TABLE_NAME='Laptop' AND 
     COLUMN_NAME NOT IN ('code') 
ORDER BY ORDINAL_POSITION 
), ' FROM Laptop'); 

http://www.sql-ex.ru/help/select20.php

0

Having खण्ड Oracle में डुप्लिकेट प्रविष्टि को खोजने के लिए सबसे आसान तरीका है और rowid का उपयोग कर हम डुप्लिकेट डेटा निकाल सकते हैं है MySQL में व्यक्त किया जा सकता

DELETE FROM products WHERE rowid IN (
    SELECT MAX(sl) FROM (
    SELECT itemcode, (rowid) sl FROM products WHERE itemcode IN (
    SELECT itemcode FROM products GROUP BY itemcode HAVING COUNT(itemcode)>1 
)) GROUP BY itemcode); 
0

यह एक

SELECT country_id, country_title 
FROM (SELECT country_id, country_title, 
CASE 
WHEN country_title=LAG(country_title, 1, 0) OVER(ORDER BY country_title) THEN 1 
ELSE 0 
END AS "Duplicates" 
FROM tbl_countries) 
WHERE "Duplicates"=0; 
संबंधित मुद्दे