जब उपकुंजी को EXISTS के साथ प्रस्तुत नहीं किया जाता है, तो केवल एक ही अभिव्यक्ति का चयन सूची में किया जा सकता है


178

मेरी क्वेरी निम्नानुसार है, और इसके भीतर एक उपश्रेणी शामिल है:

 select count(distinct dNum)
 from myDB.dbo.AQ
 where A_ID in 
  (SELECT DISTINCT TOP (0.1) PERCENT A_ID, 
            COUNT(DISTINCT dNum) AS ud 
 FROM         myDB.dbo.AQ
 WHERE     M > 1 and B = 0 
 GROUP BY A_ID ORDER BY ud DESC)

मुझे जो त्रुटि प्राप्त हो रही है, वह है ...

Only one expression can be specified in the select list when the subquery is not
introduced with EXISTS.`

जब मैं उप-क्वेरी को अकेले चलाता हूं, तो यह ठीक होता है, इसलिए मैं मान रहा हूं कि मुख्य क्वेरी के साथ कुछ समस्या है?

जवाबों:


230

आप अपने उप-वर्ग में दो (या एकाधिक) कॉलमों की तुलना WHERE A_ID IN (subquery)खंड में करने के लिए नहीं कर सकते - यह तुलना A_IDकरने के लिए किस कॉलम को माना जाता है? आपके सबक्वेरी में केवल स्तंभ के दूसरी ओर के कॉलम की तुलना के लिए आवश्यक एक कॉलम को वापस करना होगा IN। तो प्रश्न फॉर्म का होना चाहिए:

SELECT * From ThisTable WHERE ThisColumn IN (SELECT ThatColumn FROM ThatTable)

आप सॉर्टिंग भी जोड़ना चाहते हैं, ताकि आप शीर्ष पंक्तियों से चयन कर सकें, लेकिन आपको अपने सॉर्ट करने के लिए COUNT को कॉलम के रूप में वापस करने की आवश्यकता नहीं है; ORDERक्लॉज में सॉर्ट करना क्वेरी द्वारा दिए गए कॉलम से स्वतंत्र है।

कुछ इस तरह की कोशिश करो:

select count(distinct dNum) 
from myDB.dbo.AQ 
where A_ID in
    (SELECT DISTINCT TOP (0.1) PERCENT A_ID
    FROM myDB.dbo.AQ 
    WHERE M > 1 and B = 0
    GROUP BY A_ID 
    ORDER BY COUNT(DISTINCT dNum) DESC)

83

आपको उस कॉलम में केवल एक कॉलम और एक पंक्ति वापस करनी चाहिए जहां आप किसी चर पर लौटाए गए मान को असाइन करते हैं। उदाहरण:

select * from table1 where Date in (select * from Dates) -- Wrong
select * from table1 where Date in (select Column1,Column2 from Dates) -- Wrong
select * from table1 where Date in (select Column1 from Dates) -- OK

2
इसने मेरी मदद नहीं की। मुझे वही त्रुटि देता है। *मेरी मदद करने के बजाय कॉलम निर्दिष्ट करना ।
मोहम्मदसलीम शिवानी

11

इसकी शिकायत है

COUNT(DISTINCT dNum) AS ud 

उपकुंजी के अंदर। जब तक आप किसी मौजूद क्वेरी का प्रदर्शन कर रहे हों, तब तक केवल एक कॉलम को उपकुंजी से वापस किया जा सकता है। मुझे यकीन नहीं है कि आप एक ही कॉलम पर दो बार गिनती क्यों करना चाहते हैं, सतही तौर पर यह बेमानी लगता है कि आप क्या कर रहे हैं। यहां की उपश्रेणी केवल एक फिल्टर है यह एक जोड़ के समान नहीं है। यानी आप इसका उपयोग डेटा को प्रतिबंधित करने के लिए करते हैं, न कि यह बताने के लिए कि किस कॉलम को वापस लाना है।


कभी-कभी, आप क्वेरी परिणामों के खिलाफ शामिल हो सकते हैं और इससे समस्या हल हो जाएगी!
जोसेफडोगी

5

यहां बहुत अच्छी प्रतिक्रियाओं के अलावा, आप यह भी कोशिश कर सकते हैं कि क्या आप अपनी उप क्वेरी का उपयोग करना चाहते हैं।

दृष्टिकोण:

1) अपनी उप क्वेरी से वांछित कॉलम (केवल 1) का चयन करें

2) कॉलम नाम को मैप करने के लिए उपयोग करें

कोड:

 SELECT count(distinct dNum)
 FROM myDB.dbo.AQ
 WHERE A_ID in 
   (
    SELECT A_ID 
    FROM (SELECT DISTINCT TOP (0.1) PERCENT A_ID, COUNT(DISTINCT dNum) AS ud 
          FROM         myDB.dbo.AQ
          WHERE     M > 1 and B = 0 
          GROUP BY A_ID ORDER BY ud DESC
         ) a 
   )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.