2013-09-24 9 views
5

हाय हर एक मैं में इस क्वेरी का उपयोग करके शामिल मामले बयान का उपयोग करना चाहते जुड़ें और त्रुटिप्रयोग करें प्रकरण वक्तव्य में

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 

FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID 
    WHEN ts.ACCOUNTTYPE='2' THEN ts.ACCOUNTID=SI.EMPLOYEEID 
    WHEN ts.ACCOUNTTYPE='3' THEN ts.ACCOUNTID=SI.SUPPLIERID 
    WHEN ts.ACCOUNTTYPE='4' THEN ts.ACCOUNTID=SI.SALESCUSTOMERID 

त्रुटि

गलत वाक्य रचना के पास '=' मिला है।

कृपया मुझे इस त्रुटि को हल करने में मदद।

उत्तर

13

आईटी होना चाहिए,

ON 
ts.ACCOUNTID = CASE 
        WHEN ts.ACCOUNTTYPE = '1' THEN SI.TENANCYID 
        WHEN ts.ACCOUNTTYPE = '2' THEN SI.EMPLOYEEID 
        WHEN ts.ACCOUNTTYPE = '3' THEN SI.SUPPLIERID 
        WHEN ts.ACCOUNTTYPE = '4' THEN SI.SALESCUSTOMERID 
       END 
0

आप सिंटेक्स त्रुटि है। आप END गायब हैं।

6
इसके बजाय मामले का उपयोग करने का

, मैं बहुत बल्कि ऐसा करने चाहते हैं:

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 
FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON 
     (ts.ACCOUNTTYPE='1' AND ts.ACCOUNTID=SI.TENANCYID) 
    OR (ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID) 
    OR (ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID) 
    OR (ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID) 

व्याख्या करने के लिए क्यों क्वेरी आप के लिए काम नहीं किया: CASE की वाक्य रचना खंड के अंत में एक END की आवश्यकता है । यह काम करेगा, क्योंकि अन्य समाधान प्रस्तावित सुझाव देते हैं, लेकिन मुझे यह संस्करण समझने के लिए और अधिक सुविधाजनक लगता है - हालांकि यह हिस्सा अत्यधिक व्यक्तिपरक है।

+0

आपने क्वेरी काम किया है लेकिन आपने वास्तव में यह नहीं समझाया कि त्रुटि का कारण क्या था। – nimdil

1

आप ऐसा कर सकते हैं, तो आप कुछ गलत लिखा करने के लिए कोई मौका है (ध्यान दें कि ACCOUNTTYPE और ACCOUNTID ही प्रयोग किया जाता है जब की जरूरत है, आप इसे कॉपी-पेस्ट की जरूरत नहीं है)

select 
    convert(varchar(10), SII.SIDATE,103) as DATE, 
    SII.SALEID, SII.ItemName, SI.TenancyID 
from F_SALESINVOICEITEM as SII 
    inner join F_SALESINVOICE as SI on SI.SALEID = SII.SALEID 
    outer apply (
     '1', SI.TENANCYID 
     '2', SI.EMPLOYEEID 
     '3', SI.SUPPLIERID 
     '4', SI.SALESCUSTOMERID 
    ) as C(ACCOUNTTYPE, ACCOUNTID) 
    inner join #TempTableSearch as ts on 
     ts.ACCOUNTTYPE = C.ACCOUNTTYPE and ts.ACCOUNTID = C.ACCOUNTID 
0

आप समझना चाहिए कि CASE ... END ब्लॉक सी-जैसी भाषाओं से IF { } के बराबर नहीं है। इसके बजाय यह सी-जैसी भाषाओं से ... ? ... : ... ऑपरेटर के विस्तृत संस्करण के बराबर है। इसका क्या अर्थ है कि WHOLE CASE ब्लॉक अनिवार्य रूप से एकल मान का मूल्यांकन करना चाहिए और यह मान एक ही प्रकार का होना चाहिए चाहे कोई भी ब्लॉक ब्लॉक न हो। इसका मतलब है कि:

CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID ... 
END 

मौलिक गलत है जब तक आप यह है कि आप एक मूल्य (SQL सर्वर के रूप में मूल्य bool उदाहरण के लिए यह अनुमति नहीं दी जाएगी अनुमति देगा डेटाबेस के एक संस्करण पर काम है लेकिन मैं MySQL संस्करण में से कुछ के लिए इस्तेमाल किया लगता है इसे अनुमति दें - इस बारे में निश्चित नहीं है)। आप शायद कुछ ऐसा लिखना चाहिए:

CASE 
WHEN ts.ACCOUNTTYPE = '1' AND ts.ACCOUNTID=SI.TENANCYID THEN 1 
WHEN ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID THEN 1 
WHEN ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID THEN 1 
WHEN ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID THEN 1 
ELSE 0 
END = 1 

सूचना कैसे पूरे CASE ब्लॉक 1 या 0 पर मूल्यांकन करता है और फिर इसे WHEN की आप AND के संयोजन के साथ एक WHEN इस्तेमाल कर सकते हैं 1. बेशक 4 के बजाय की तुलना में है , OR और () ब्रैकेट्स हैं। बेशक इस विशेष मामले में @ppeterka 66 द्वारा उत्तर CASE के रूप में सही है जो आप वास्तव में करना चाहते हैं उसके लिए उपयुक्त नहीं है - मैं बस यह स्पष्ट करने की कोशिश कर रहा हूं कि CASE वास्तव में क्या है।

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