EXISTS

2011-02-17 10 views
20

पर SELECT COUNT को अनुकूलित करना मेरे पास एक तालिका से कुछ ग्राहकों को खोजने के लिए एक प्रश्न है।EXISTS

SELECT COUNT(*) 
    FROM CUSTOMER 
WHERE amount <> 0 
    AND customerid = 22 

CustomerID पर एक सूचकांक नहीं है, इसलिए डीबी CustomerID वाली सभी पंक्तियों को स्कैन करता है = 22.

के बाद से परिणाम देखना हो गिनती शून्य या शून्य से अधिक रिटर्न द्वारा संसाधित किया जाता है, मैं कैसे अनुकूलन कर सकते हैं पूछताछ? अर्थात। ऐसी है कि राशि के साथ पहले ग्राहक पंक्ति में <> 0 क्वेरी 0 बाकी लौटाता है यदि सभी पंक्तियों = 0, तो CustomerID और राशि पर लौटने 1.

+0

संबंधित: http://stackoverflow.com/questions/2759756/is-it-possible-to-select-exists- प्रत्यक्ष रूप से-as-a-bit – RQDQ

+0

पहली ग्राहक पंक्ति किस तारीख पर आधारित है? –

उत्तर

27
select case 
     when exists (select * 
         from customer 
         where amount <> 0 
          and customerid = 22) then 1 
     else 0 
     end as non_zero_exists 
+3

+1 IF – RichardTheKiwi

+3

के बजाय क्वेरी फ़ॉर्म का उपयोग करने के लिए +1 'क्या चुनें' 'को' ग्राहक चुनें 'या' चयन 1 'के साथ बदलना अधिक कुशल होगा? –

+3

@ करलो - नहीं, यह – RichardTheKiwi

6

पहले सूचकांक

CREATE INDEX customer_idx ON customer(customerid, amount); 

तो पुनर्लेखन आपकी क्वेरी

IF EXISTS (SELECT customerid 
    FROM customer 
    WHERE amount > 0 -- I am assuming here that amount cannot be a negative number. 
    AND customerid = 22) 
    SELECT 1 
ELSE 
    SELECT 0 

इसके परिणामस्वरूप इंडेक्स ग्राहक_आईडीएक्स पर खोजना चाहिए। अन्यथा आपको उस ग्राहक के लिए सभी पंक्तियों को स्कैन करने की आवश्यकता होगी (जो आपका प्रश्न प्रतीत होता है) बहुत कुछ हो सकता है।

+1

* प्रत्येक * एसक्यूएल प्रदर्शन प्रश्न का समाधान +1 उचित सूचकांक बनाने के लिए सबसे पहले और सबसे महत्वपूर्ण है। –

+2

@Chris यह 'कीवर्ड के पास गलत वाक्यविन्यास' उत्पन्न करता है, हालांकि इंडेक्स बिट अच्छा है –

+0

क्षमा करें, एसओ विंडो में कोडिंग कर रहा था, हमेशा एक बुरा निर्णय। आपकी क्वेरी की तरह कुछ और उपयोग करने के लिए अपडेट किया गया। आपके उत्तर में +1। –

3

सीधे आगे पर्याप्त

IF EXISTS (SELECT customerid 
      FROM customer 
      WHERE amount <> 0 
        and customerid = 22)) 
    SELECT 1 
ELSE 
    SELECT 0 
2

एक वैकल्पिक लगता है मौजूद है

select ISNULL((select TOP 1 1 
       from customer 
       where amount <> 0 
       and customerid = 22),0) 

मैं पहले से ही मान लिया है कि आप (CustomerID) या बेहतर (CustomerID, राशि) पर एक सूचकांक होगा।

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