2012-09-17 26 views
21

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

यहां प्रश्न है ... किसी भी मदद की बहुत सराहना की जाती है।

SELECT salesrep.salesrepid as SalesRepID, 
     salesrep.fname as SalesrepFName, 
     salesrep.lname as SalesRepLName, 
     salesrep.fname+' '+salesrep.lname as SalesRepFullName, 
     prescriber.dea_no as PDeaNo, 
     prescriber.lname+', '+prescriber.fname as DocName, 
     CONVERT(VARCHAR(8), prescriptions.filldate, 1) as FillDate, 
     prescriptions.drugname as DrugName, 
     prescriptions.daysupply as Supply, 
     prescriptions.qtydisp as QtyDisp, 
     prescriptions.rx_no as Refill, 
     prescriptions.copay as Sample, 
     ROUND(prescriptions.AgreedToPay-(prescriptions.AgreedToPay*.07),2) as AgreedToPay, 
     prescriptions.carrierid as CarrierID 
FROM salesrep 
    LEFT OUTER JOIN prescriber on salesrep.salesrepid = prescriber.salesrepid 
    LEFT OUTER JOIN prescriptions on prescriber.dea_no = prescriptions.dea_no 
    WHERE salesrep.salesrepid = 143 AND 
     prescriptions.filldate >= '09-01-12' AND 
     prescriptions.filldate <= '09-17-12' 
ORDER BY prescriptions.filldate 
+1

क्या डीबीएमएस? (विषय बंद, लेकिन मुझे नशीली दवाओं के प्रतिनिधि और दवा उद्योग से नफरत है) – Kermit

+3

@ एनजेके (ऑफ विषय) उद्योग के खिलाफ एक मजबूत मीडिया पूर्वाग्रह पर विचार करते हुए यह आश्चर्य की बात नहीं है :) – dasblinkenlight

उत्तर

53

आप में शामिल होने के ON हालत में prescriptions.filldate पर बाधाओं बढ़ना चाहिए, और where खंड से हटाने:

LEFT OUTER JOIN prescriptions ON prescriber.dea_no = prescriptions.dea_no 
          AND prescriptions.filldate >= '09-01-12' 
          AND prescriptions.filldate <= '09-17-12' 

अन्यथा, प्रविष्टियों जिसके लिए कोई prescriptions अंत तक null साथ कर रहे हैं prescriptions.filldate में, और WHERE खंड उन्हें दूर फेंकता है।

+0

धन्यवाद dasblinkenlight! – jgiven

0

ऐसा इसलिए है क्योंकि आपकी prescriptions.filldate असमानताएं salesrep पंक्तियों को फ़िल्टर कर रही हैं जिनके पास prescriptions.filldate कॉलम में कोई मान नहीं है।

तो यदि शून्य मान हैं (दाएं तालिकाओं से कोई मिलान डेटा नहीं), तो salesrep डेटा समेत संपूर्ण पंक्ति दिनांक फ़िल्टर द्वारा फ़िल्टर की जाती है - क्योंकि null दो तिथियों के बीच नहीं आती है।

11

Here आप क्वेरी प्रोसेसिंग चरणों के बारे में एक संक्षिप्त विवरण प्राप्त कर सकते हैं (यह अधिकांश डीबीएमएस के लिए आम है)। तुम्हें पता है, वहाँ मिलेगा बाहरी के लिए कि शामिल हों:

  1. पहले कार्तीय शामिल हों उत्पादन किया जाता है,
  2. पर हालत से
  3. पंक्तियों की परिणाम सेट का निर्माण सबसेट पर किया जाता है,
  4. के बाद से बाहरी पंक्तियों के साथ जोड़ दिए जाते हैं आंतरिक तालिका के शामिल कॉलम पर NULL,
  5. उस परिणाम पर WHERE क्लॉज फ़िल्टरिंग करने पर लागू होता है।

जब आप बाहरी तालिका पंक्तियों को छूने वाले WHERE खंड के भीतर स्थिति डालते हैं तो वे सभी को त्याग दिया जाता है। आपको बस उस शर्त को ऑन क्लॉज में रखना चाहिए, क्योंकि बाह्य पंक्तियों को जोड़ने से पहले इसका मूल्यांकन किया जाता है।

तो, उन परिस्थितियों:

prescriptions.filldate >= '09-01-12' AND 
prescriptions.filldate <= '09-17-12' 

पर खंड में ले जाया जाना चाहिए।

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