2010-02-25 9 views
7

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

मान लें कि मेरे पास "कुछ योग्य" में "माईफिल्ड" फ़ील्ड है और मैं यह जानना चाहता हूं कि माईफिल्ड मान कितने पंक्तियों से संबंधित नहीं हैं "SomeOtherTable" में "MyOtherField" के मानों द्वारा परिभाषित डोमेन। दूसरे शब्दों में, मान लीजिए कि मेरे पास MyOtherField = {1, 2, 3} है, मैं गिनना चाहता हूं कि माईफिल्ड मान कितनी पंक्तियां 1, 2 या 3 नहीं है। इसके लिए, मैं निम्न क्वेरी का उपयोग करूंगा:

SELECT COUNT(*) FROM SomeTable 
WHERE ([MyField] NOT IN (SELECT MyOtherField FROM SomeOtherTable)) 

और यह एक आकर्षण की तरह काम करता है। ध्यान दें कि माईफिल्ड और माईओथरफ़िल्ल्ड int टाइप किए गए हैं। यदि मैं वही टाइपर फ़ील्ड को छोड़कर सटीक वही क्वेरी चलाने की कोशिश करता हूं, तो इसका रिटर्निंग वैल्यू 0 है, भले ही मुझे पता है कि गलत मान हैं, मैंने उन्हें वहां रखा है! और यदि मैं, उपर्युक्त क्वेरी में "नहीं" खंड को दबाकर, विपरीत (गिनती के अनुसार डोमेन में कितनी पंक्तियां हैं, यह है कि कितनी पंक्तियां हैं) का विरोध करने की कोशिश करें ... ठीक है, काम करता है! ¬¬

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

अग्रिम धन्यवाद।

+1

क्या आपके पास उस क्षेत्र के "कुछ अन्यथा" में नल अंक हैं? –

उत्तर

6

नहीं, यह सबकुछ हमेशा गलत होता है यदि सबक्वायरी एक पूर्ण मान देता है। this question का स्वीकार्य उत्तर स्पष्ट रूप से क्यों वर्णन करता है।

एक स्तंभ मान की NULLability भी इस्तेमाल किया डेटाप्रकार से स्वतंत्र है: सबसे अधिक संभावना आपके varchar स्तंभ शून्य मान

इस समस्या से निपटने है है, मौजूद नहीं है का उपयोग करें। गैर शून्य मान के लिए, यह के रूप में नहीं एक ही काम करता है ताकि संगत

SELECT COUNT(*) FROM SomeTable S1 
WHERE NOT EXISTS (SELECT * FROm SomeOtherTable S2 WHERE S1.[MyField] = S2.MyOtherField) 
+0

धन्यवाद, खंड के साथ आपके सुझाए गए प्रश्न का उपयोग न करने वाले EXISTS ने जो किया था वह काफी हद तक किया। –

0

GBN एक अधिक पूरा जवाब है, लेकिन मैं यह सब याद करने के लिए परेशान नहीं किया जा सकता। इसके बजाय मेरे पास मेरे इन क्लॉज से नल को फ़िल्टर करने की धार्मिक आदत है:

SELECT COUNT(*) 
FROM SomeTable  
WHERE [MyField] NOT IN (
    SELECT MyOtherField FROM SomeOtherTable 
    WHERE MyOtherField is not null 
) 
संबंधित मुद्दे