2009-03-14 16 views
6

मैं इसे SQL सर्वर सीई डेटाबेस में करने की कोशिश कर रहा हूं, लेकिन डेटाबेस इंजन रिपोर्टिंग त्रुटियों को रखता है।एसक्यूएल सर्वर कॉम्पैक्ट संस्करण में सबक्वायरी

SELECT C.guid, C.name, C.updated, 
     C.hddsize, C.hddavailable, C.hddfree, 
     C.ramsize, C.profiles, C.cpu, 
     (SELECT COUNT(D.id) AS numprogs 
      FROM ComputerData AS D 
      WHERE D.computer_id = C.id) AS numprograms 
FROM Computers AS C; 

मुझे बताया गया है कि SQL सर्वर सीई subqueries का समर्थन करता है। क्या मैं कुछ गलत कर रहा हूं?

+0

त्रुटि क्या है? –

+0

हाय, क्षमा करें, यह तय किया गया है। धन्यवाद सब, अज़ुका – Zahymaka

उत्तर

5

प्रश्नों में मेरा एकमात्र अनुभव MySQL के साथ है, लेकिन उम्मीद है कि यह काफी समान है।

आपकी क्वेरी मुझे अजीब लगती है क्योंकि आपकी सबक्विरी SELECT क्लॉज में है। मैंने पहले कभी नहीं देखा है ... लेकिन स्पष्ट रूप से यह MySQL में समर्थित है। आमतौर पर सबक्वायरी फॉर या बाएं जॉइन या जॉइन के बाद आता है।

आपका उदाहरण काफी सरल है कि आप इसे एक वाम के साथ लागू कर सकता है शामिल हों:

SELECT C.guid, ..., COUNT(distinct D.id) as numprogs 
FROM Computers AS C 
LEFT JOIN ComputerData as D ON D.computer_id = C.id 

इस मामले में, वाम शामिल हों क्योंकि उपयोग करने के लिए भले ही में कोई मिलता-जुलता रिकॉर्ड है में शामिल होने का सही प्रकार है किसी विशेष सी रिकॉर्ड के लिए डी तालिका, आपके परिणाम सेट में अभी भी शामिल होगा कि सी रिकॉर्ड और numprogs केवल शून्य होंगे, जैसा कि आप उम्मीद करेंगे।

तुम सच में एक सबक्वेरी उपयोग करना चाहते हैं, इस प्रयास करें:

SELECT C.guid, ..., S.numprogs 
FROM Computers AS C 
LEFT JOIN 
(SELECT computer_id, COUNT(*) as numprogs 
FROM ComputerData GROUP BY computer_id) AS S 
ON C.id=S.computer_id 

मैं इसे सरल संभव क्वेरी जो काम करना चाहिए होने के लिए प्राप्त करने के लिए आपकी क्वेरी को सरल बनाने का सुझाव देते हैं, लेकिन काम नहीं करता। फिर हमें एक विशिष्ट त्रुटि संदेश बताएं कि आपका डेटाबेस इंजन लौट रहा है।

संपादित करें: मैंने MySQL chapter about subqueries में देखा था और ऐसा लगता है कि आपको अपने सबक्वायरी के बाद "numprograms" खंड को हटाने का प्रयास करना चाहिए ... शायद आपको कॉलम के नामकरण के बारे में कोई विकल्प नहीं मिलता है subquery पहले से ही subquery बना दिया है।

+1

धन्यवाद आदमी। पहली क्वेरी काम नहीं किया, लेकिन दूसरा किया - पूरी तरह से। यह उन उदाहरणों के लिए पूर्ण लौटाता है जहां गिनती 0 थी, लेकिन मुझे पता है कि डेटा के आधार पर मुझे मिल जाएगा, मैं 99.99% निश्चित हूं कि कभी भी 0 गिनती नहीं होगी। धन्यवाद, अज़ुका – Zahymaka

+0

कूल, यह जानना अच्छा है कि यह काम करता है! यदि आप 100% सुनिश्चित करना चाहते हैं कि मान शून्य नहीं है, तो आप "IF (S.numprogs IS NULL, 0, S.numprogs)" के साथ Snumprogs को प्रतिस्थापित कर सकते हैं, या शॉर्टंड नोटेशन का उपयोग करें जो "IFNULL (S .numprogs, 0) " –

23

एसक्यूएल सीई में सीमा यह है कि यह उप-सामानों का समर्थन नहीं करता है जो स्केलर मान लौटाते हैं। एक सेट लौटने वाली सबक्वायरीज़ को ठीक से पार्स किया जाता है।

ग्रेसन के उत्तर में शामिल होने में सबक्वायरी एक सेट देता है, इसलिए इसे काम करना चाहिए। कभी-कभी एक स्थिति में एक स्केलर सबक्वायरी से बचा नहीं जा सकता है। '=' के बजाय 'IN' का उपयोग करके, पार्सर को धोखा दिया जा सकता है।

this question पर मेरा उत्तर देखें।

+0

अच्छा, यह समाधान मेरे लिए काम किया! –

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