2010-10-19 9 views
6

यदि आप एक में शामिल होने है कि इस छोड़कर खेतों कि शून्य

SELECT T1.KeyField1, T1.KeyField2, T2.Field3 
FROM T1 JOIN T2 ON T1.KeyField1 = T2.KeyField1 AND T1.KeyField2 = T2.KeyField2 

तरह लग रहा है कर रहे हैं वहाँ एक रास्ता NULLS परिणामों के समान मिलान करने के लिए अनुमति नहीं करने के लिए है में शामिल हों पर से मेल खाता है कि इस प्रश्न के वापस होगा

SELECT T1.KeyField1, T1.KeyField2, T2.Field3 
FROM T1 JOIN T2 ON T1.KeyField1 = T2.KeyField1 AND T1.KeyField2 = T2.KeyField2 
       AND T1.KeyField2 IS NOT NULL AND T2.KeyField2 IS NOT NULL 

संपादित

012,351,

मैंने वास्तव में गलत सवाल पूछा .... मुझे दोबारा प्रयास करने दो।

हम पुराने डेटा को एक नया डेटा तुलना कर रहे हैं और रिकॉर्ड की तलाश कर रहे हैं जहां पंक्तियां बिल्कुल समान हैं।

तो दोनों तालिकाओं में परिभाषित किया गया:

CREATE TABLE [Table](
    [Identifier] [int] IDENTITY(1,1) NOT NULL, 
    [Key1] [varchar](50) NOT NULL, 
    [Data1] [varchar](50) NULL, 
    [Data2] [varchar](50) NULL 

अगर मैं क्वेरी कार्य करें:

DELETE 
FROM T1 JOIN T2 ON T1.Key1 = T2.Key1 
       AND T1.Data1 = T2.Data2 AND T1.Data2 = T2.Data2 

दें

T1 & T2 

| Key1 | Data1  | Data2 | 
| 1000 | 123 Main St | <NULL> | 
| 1001 | 456 High St | FLOOR 2 | 

यह टी 1 से डुप्लिकेट रिकॉर्ड 1000 के बाद से नहीं निकलेगी Data2 है शून्य।

शामिल होने में जादू मूल्य का उपयोग करने के बाहर, क्या इनका तुलना करने का कोई और तरीका है?

मैं समझता हूं कि सलाहकारों को सभी नलिकाओं को '' के रूप में सम्मिलित करने के लिए कोड को फिर से लिखना चाहिए, लेकिन इस बिंदु पर यह एक बड़ा उपक्रम है। मैं मतभेदों को देखने के लिए पंक्ति को हैशिंग भी देख रहा हूं।

उत्तर

3

कोशिश इस का उपयोग करते हुए:

SET ANSI_NULLS ON 

http://msdn.microsoft.com/en-us/library/aa259229(SQL.80).aspx

संपादित

"जादू संख्या" की तरह के साथ शामिल होने:

ISNULL(T1.Field1, '-9999') = ISNULL(T2.Field2, '-9999') 

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

+0

अधिकार के साथ शुरू NULLs पर कुछ दिलचस्प तर्क पढ़ सकते हैं। मुझे याद रखना चाहिए था। कभी-कभी हमें NULL = NULL की तुलना भी करनी पड़ती है।चूंकि SET ANSI_NULLS OFF अंततः एक त्रुटि उत्पन्न करने का कारण बनता है, क्या ISNULL (T1.Field1, '-9999') = ISNULL (T2.Field2, '-9999') –

4

आप कुछ हद तक श्रमसाध्य

DELETE 
FROM T1 JOIN T2 ON T1.Key1 = T2.Key1 
       AND 
       (T1.Data1 = T2.Data1 
       OR 
        (T1.Data1 is Null AND T2.data1 is Null) 
       ) 
       AND 
       (T1.Data2 = T2.Data2 
       OR 
        (T1.Data2 is Null AND T2.Data2 is Null) 
       ) 
+0

का उपयोग करके तुलना करने के लिए कोई तरीका है w/o आश्चर्यचकित रहें यदि ऑप्टिमाइज़र उपर्युक्त शर्तों को कहां से रोकता है ... (T1.Key1 = T2.Key2 को छोड़कर) +1 – Unreason

0

कॉनरैड की और के.एम. के जवाब अपने कार्य को प्राप्त करने पर विचार किया है, लेकिन कोई भी बहुत साफ है। मुख्य कारण यह है कि एनयूएलएल के परिचय के साथ एसक्यूएल ने तीन मूल्य तर्क के लिए समर्थन की अनुमति दी जहां एनयूएलएल बराबर नहीं है (ऑपरेटर =)।

आपका मामला वजहों NULLs विवादास्पद रहे हैं में से एक है और आप wikipedia

+0

बहुत खराब कोड ने –

+0

@ कॉनराड Frix, सहमत नहीं है, लेकिन फिर भी अगर आज के आरडीबीएमएस की सबसे बड़ी वैचारिक समस्या थी जो हम बहुत अच्छे आकार में होंगे ... – Unreason

संबंधित मुद्दे