2010-12-30 19 views
5

मेरे पास एक सारणी है जिसमें असुरक्षित रूप से खराब डेटा है और मैं कुछ फ़िल्टर करने की कोशिश कर रहा हूं। मुझे यकीन है कि LName, FName combonation अद्वितीय है क्योंकि डेटा सेट सत्यापित करने के लिए पर्याप्त छोटा है।एसक्यूएल लगभग डुप्लिकेट पंक्तियां हटाएं

LName, FName, Email 
----- ----- ----- 
Smith Bob [email protected] 
Smith Bob NULL 
Doe Jane NULL 
White Don [email protected] 

मैं क्वेरी परिणाम करना चाहते हैं "नकल" रिकॉर्ड है कि एक शून्य ईमेल नहीं है, अभी तक अभी भी वापस एक शून्य ईमेल लाना है जब वहाँ एक डुप्लिकेट नहीं है वापस लाने।

उदा।

Smith Bob [email protected] 
Doe Jane NULL 
White Don [email protected] 

मुझे लगता है कि समाधान Sql, remove duplicate rows by value के समान है, लेकिन मैं वास्तव में समझ में नहीं आता है, तो प्रश्नकर्ता की आवश्यकताओं मेरा जैसे ही हैं।

कोई सुझाव?

धन्यवाद

+0

साइबरनेट और माइकल गोल्डशेटिन के समाधान के लिए धन्यवाद। FooLman बी/सी के साथ गया यह नौकरी किया पहला समाधान था। संकल्प के लिए विभिन्न तरीकों को देखना दिलचस्प है। – jimueller

उत्तर

7

इस अशक्त पंक्तियों चला जाता है अगर कोई गैर शून्य मान रहे हैं।

SELECT lname 
     , fname 
     , MIN(email) 
FROM YourTable 
GROUP BY 
     lname 
     , fname 

टेस्ट स्क्रिप्ट

DECLARE @Test TABLE (
    LName VARCHAR(32) 
    , FName VARCHAR(32) 
    , Email VARCHAR(32) 
) 

INSERT INTO @Test 
    SELECT 'Smith', 'Bob', '[email protected]' 
    UNION ALL SELECT 'Smith', 'Bob', 'NULL' 
    UNION ALL SELECT 'Doe', 'Jane', 'NULL' 
    UNION ALL SELECT 'White', 'Don', '[email protected]' 

SELECT lname 
     , fname 
     , MIN(Email)   
FROM @Test 
GROUP BY 
     lname 
     , fname 
+1

+1 यह अब तक * सबसे आसान * समाधान पोस्ट किया गया है जो पूछा जाता है। समुदाय overengeneering से पीड़ित लगता है। –

+0

@Lieven - हालांकि यह काम नहीं करेगा! यदि कोई गैर शून्य नहीं है तो शून्य पंक्तियों को रखने के लिए कोई तर्क कहां है? –

+0

@ मार्टिन, क्वेरी ने दिए गए इनपुट के लिए ऑप द्वारा अनुरोधित आउटपुट का उत्पादन नहीं किया है (या फिर मैंने फिर से गुमराह किया है)? –

3

यहाँ एक अपेक्षाकृत सरल क्वेरी मानक SQL का उपयोग करता है और सिर्फ इस करता है जो:

SELECT * FROM Person P 
WHERE Email IS NOT NULL OR -- Take all people with non-null e-mails 
     Email IS NULL AND -- and all people with null e-mails, as long as 
     NOT EXISTS   -- there is no duplicate record of the same person 
      (SELECT *  -- with a non-null e-mail 
      FROM Person P2 
      WHERE P2.LName=P.LName AND P2.FName=P.FName AND P2.Email IS NOT NULL) 
+0

क्या आप यह कह रहे हैं कि 'row_number' मानक एसक्यूएल नहीं है? –

+0

मैं कुछ भी नहीं कह रहा हूं - एक उप-चयन से जुड़े मानक SQL क्वेरी से अधिक कुछ भी नहीं का उपयोग करके बस एक सरल समाधान प्रदान करता हूं। लेकिन, यदि आप ROW_NUMBER से संबंधित अपने प्रश्न का उत्तर चाहते हैं, तो यह मानक SQL नहीं है और न ही पक्ष है। –

+0

एएनएसआई एसक्यूएल 1 999 [यहां के अनुसार] (http://ss64.com/ora/syntax-analytic.html) यह नहीं कि मानक एसक्यूएल कभी भी ओपी द्वारा निर्दिष्ट किया गया था। –

7

आप ROW_NUMBER() विश्लेषणात्मक समारोह का उपयोग कर सकते हैं:

SELECT * 
    FROM (
       SELECT a.*, ROW_NUMBER() OVER(PARTITION BY LName, FName ORDER BY Email DESC) rnk 
        FROM <YOUR_TABLE> a 
       ) a 
WHERE RNK = 1 
+0

+1 यह शायद स्वयं से जुड़ने से अधिक कुशल होगा। इस तकनीक का उपयोग मेरे उत्तर के साथ-साथ हटाने के लिए भी किया जा सकता है। –

1

चूंकि बहुत से SQL समाधान पहले से पोस्ट किए गए हैं, इसलिए आप खराब डेटा को हटाने के लिए डेटा फ़िक्स बनाना चाहते हैं, फिर खराब डेटा को कभी भी डालने से रोकने के लिए आवश्यक बाधाएं जोड़ें। डेटाबेस में खराब डेटा खराब डिजाइन का दुष्प्रभाव है।

+0

मैं सहमत हूं और समझता हूं, लेकिन एंटरप्राइज़ आईटी भूमि में इसके बारे में मैं इतना कुछ नहीं कर सकता। यह उस डेटा की वास्तविकता है जिसके साथ मुझे काम करना है। – jimueller

+0

@ jrm82, एंटरप्राइज़ अनुप्रयोगों में ऐसी चीजों को ठीक करने के लिए यह और भी महत्वपूर्ण है! सिर्फ इसलिए कि यह apin का मतलब यह नहीं है कि आपको यह नहीं करना चाहिए। यदि आप ठीक नहीं करते हैं तो इससे हमेशा समस्याओं का कोई अंत नहीं होगा। – HLGEM

+0

एचएलजीईएम - मेरे पास डेटा नहीं है और मेरे पास जो कुछ भी मैं चाहता हूं उस पर काम करने की क्षमता नहीं है। – jimueller