2012-06-22 14 views
7

मैं पुराने स्टाइल सिंटैक्स का उपयोग करके नए प्रश्न वाक्यविन्यास में एक क्वेरी को परिवर्तित करने में व्यस्त हूं। मेरी क्वेरी का सार इस प्रकार है:एसक्यूएल इनर जॉइन। ऑन कंडीशन बनाम WHERE क्लॉज

मूल प्रश्न

SELECT i.* 
FROM 
    InterestRunDailySum i, 
    InterestRunDetail ird, 
    InterestPayments p 
WHERE 
    p.IntrPayCode = 187 
    AND i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode 
    AND ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode 

नई क्वेरी

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.IntRunCode = p.IntRunCode) 
    WHERE 
    p.IntrPayCode = 187 

इस उदाहरण में, "मूल प्रश्न" 46 पंक्तियाँ, जहां "नया प्रश्न" से अधिक रिटर्न देता है 800

क्या कोई मुझे अंतर बता सकता है? मैंने माना होगा कि ये प्रश्न समान हैं।

उत्तर

17

समस्या आपके InterestRunDetail में शामिल होने के साथ है। आप IntRunCode पर दो बार शामिल हो रहे हैं।

सही क्वेरी होना चाहिए:

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode) 
    WHERE 
    p.IntrPayCode = 187 
+1

धन्यवाद केविन, मैं मूर्ख को ऐसा नहीं ढूंढने के लिए महसूस करता हूं !! – Russell

+2

यह हम सभी के साथ होता है। :-) –

4

"नई क्वेरी" एक वर्तमान ANSI SQL मानक के लिए मिलती है साथ संगत है।

इसके अलावा, मैं # क्वेरी 2 बहुत क्लीनर लगता है:

  • आप लगभग बारे में सोचते हैं और दो तालिकाओं के बीच हालत (रों) में शामिल होने को निर्दिष्ट करने के लिए मजबूर कर रहे हैं - अगर आप गलती से कार्तीय नहीं होगा आपकी क्वेरी में उत्पाद। यदि आप दस टेबल सूचीबद्ध करते हैं, लेकिन आपके WHERE खंड में केवल छह शामिल हैं - आपको बहुत अधिक अपेक्षित डेटा वापस मिलेगा!

  • अपने WHERE खंड से भरा हुआ नहीं है की स्थिति में शामिल होने और इस प्रकार यह क्लीनर है, कम, गंदा आसान पढ़ने और समझने में

  • प्रकार के अपने JOIN (INNER JOIN चाहे, LEFT OUTER JOIN, CROSS JOIN) आम तौर पर है देखने के लिए बहुत आसान है - क्योंकि आप इसे जादू करते हैं। "पुरानी शैली" वाक्य रचना के साथ, उन के बीच का अंतर प्रकार में शामिल होने के बजाय देखना कठिन, WHERE मापदंड के अपने बहुत सारी में कहीं दफन है .....

कार्यात्मक रूप से, दो समान हैं - # 1 कुछ क्वेरी इंजनों द्वारा जल्दी या बाद में बहिष्कृत किया जा सकता है।

भी अधिक जानकारी के लिए हारून बर्ट्रेंड उत्तम Bad Habits to Kick - using old-style JOIN syntax ब्लॉग पोस्ट देखें - और जब आप ऐसा कर रहे हैं - सभी बहुत बहुत इसके लायक - सभी "बुरी आदतों लात" पोस्ट पढ़ें!

+1

अच्छा उत्तर - लेकिन उनके प्रश्न वास्तव में समान नहीं हैं - ऐसा लगता है कि यह सिर्फ एक टाइपो था ;-) –

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