2010-07-07 6 views
6

मेरे पास तीन टेबल, 'ए', 'बी' और 'सी' हैं। मेरे पास 'ए' और 'बी' पर पूछताछ है, लेकिन मैं एक ऐसा क्षेत्र जोड़ना चाहता हूं जो मुझे बताता है कि एक या अधिक (मैं 'कितनी परवाह नहीं करता)' सी 'जो' ए 'के लिए विदेशी कुंजी है।अगर कोई बाएं किसी भी पंक्ति में लौटता है तो '1' वापस करने का एक बेहतर तरीका?

SELECT A.A_id, A.col_2, col_3, B.col_2, A.col_4 
      count(C.id) as C_count 
FROM  A 
JOIN  B ON (A.B_id = B.B_id) 
LEFT JOIN C ON (A.A_id = C.A_id) 
WHERE  A.A_id = ? 
GROUP BY A.A_id, A.col_2, col_3, B.col_2, A.col_4 
ORDER BY CASE WHEN A.col_2 = ? 
       THEN 0 
       ELSE 1 
      END, col_3; 

यह थोड़ा अक्षम लगता है, दोनों क्योंकि मैं GROUP BY और भी में उन सभी क्षेत्रों क्योंकि मैं भरोसा कर रहा हूँ सूची जहां सभी मैं वास्तव में चाहते हैं है या नहीं है:

यहाँ मैं क्या है है कम से कम एक मैच या नहीं। क्या यह सुधार किया जा सकता है?

+1

सिर्फ इसलिए कि आप स्तंभ नाम का एक बहुत टाइप करने के लिए एक प्रश्न अक्षम नहीं है था;) इस मामले में हालांकि, आप सही कर रहे हैं। गिनती को छंटनी और टैबलेट करना महंगा है, लेकिन शायद अधिक महंगा यह है कि डीबी को उस गिनती के लिए तालिका सी में सभी पंक्तियों से गुज़रना पड़ता है। EXISTS समाधान के साथ जैसे ही यह पहली मिलान पंक्ति पाता है, यह दिखना बंद कर सकता है। –

+0

अच्छी व्याख्या, @ टॉम। –

उत्तर

13

उपयोग के बजाय एक सबक्वेरी के साथ मौजूद है ...

Select A.A_id, A.col_2, col_3, 
    B.col_2, A.col_4, 
    Case When Exists (Select * From C 
         Where A_id = A.A_id) 
     Then 1 Else 0 End As C_Exists 
From A Join B 
    On (A.B_id = B.B_id) 
Where A.A_id = ?  
Order By Case When A.col_2 = ? 
      Then 0 Else 1 End, col_3; 
+0

+1 मौजूद है :-) – corsiKa

+0

उत्कृष्ट। EXPLAIN योजना का कहना है कि यह भी बेहतर है। 3 मिनट जब तक मैं इसे स्वीकार नहीं कर सकता। –

+1

@ पॉल टॉम्बलिन: ऐसा इसलिए है क्योंकि मानदंडों के पहले सफल मैच के रूप में जल्द ही सत्य वापस आ जाएंगे - सभी मिलान मानदंडों की जांच करने के लिए EXISTS की आवश्यकता नहीं है। –

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