2011-12-21 14 views
21

क्या इस तरह mysql क्वेरी निष्पादित करना संभव है?माइस्क्ल सबक्वायरी परिणाम "कहां" खंड

select (select A from B where ...) as C from D where C like ' ... ' 

मुझे सामान्य "जहां" खंड में सबक्वायरी के परिणाम का उपयोग करने की आवश्यकता है।

उत्तर

27

आप इस प्रकार का उप क्वेरी में लपेट कर सकते हैं:

SELECT * 
FROM (
     select (select A from B where ...) as C from D 
    ) subq 
WHERE 
    C like ' ... ' 
+1

+1 आपने मेरे सामने समाप्त किया ... –

+0

मुझे लगता है कि यह काम करना चाहिए, लेकिन मुझे लगता है कि मैं इसे अपने उद्देश्य के लिए उपयोग नहीं कर सकता। मुझे "फ़ील्ड 1, फ़ील्ड 2, एसक्यूएल 3 फ़ील्ड 3, फ़ील्ड 4, एसक्यूएल 5 के रूप में फ़ील्ड 5 के रूप में फ़ील्ड 2 के रूप में फ़ील्ड 2 के रूप में चुनें, फ़ील्ड 2 = '...', field5 = '...' – Eddie

+0

@ एडी, हाँ आप इसका इस्तेमाल कर सकते हैं। उस खंड के हिस्सों को ले जाएं जहां उपखंड व्युत्पन्न क्षेत्र का बाहरी भाग में उपयोग किया जाता है। –

7

क्या आपने इसे पढ़ा है?

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

एक सबक्वेरी एक और बयान के भीतर एक का चयन करें बयान है।

MySQL 4.1 से शुरू होने वाले सभी सबक्वायरी फॉर्म और ऑपरेशंस जो SQL मानक आवश्यक हैं, साथ ही कुछ विशेषताएं जो MySQL- विशिष्ट हैं।

यहाँ एक सबक्वेरी का एक उदाहरण है:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 

इस उदाहरण में, चुनें * t1 से ... बाहरी क्वेरी (या बाहरी बयान), है और (स्तम्भ 1 का चयन करें टी 2 से) subquery है। हम कहते हैं कि subquery बाहरी क्वेरी के भीतर घोंसला है, और वास्तव में अन्य उपक्वियरों के भीतर उपनगरीय घनत्व के लिए घोंसला करना संभव है। सबक्वायरी हमेशा कोष्ठक के भीतर दिखाई देना चाहिए।

सबक्वेरी के मुख्य लाभ कर रहे हैं:

वे प्रश्नों कि संरचित कर रहे अनुमति देने के इतना है कि यह संभव है एक बयान के प्रत्येक भाग को अलग करने की।

वे पर संचालन करने के वैकल्पिक तरीके प्रदान करते हैं अन्यथा जटिल जोड़ों और संघों की आवश्यकता होती है।

कई लोगों को जटिल जुड़ने या यूनियनों की तुलना में सबक्वायरी अधिक पठनीय लगता है। वास्तव में, यह है कि लोगों को जल्दी एसक्यूएल बुलाने की मूल विचार दे दी है सबक्वेरी के नवाचार था "स्ट्रक्चर्ड क्वेरी भाषा।"

यहाँ एक उदाहरण बयान के रूप में एसक्यूएल द्वारा निर्दिष्ट है कि के बारे में सबक्वेरी वाक्य रचना प्रमुख अंक से पता चलता है मानक और में समर्थित MySQL:

1

कोई नहीं के रूप में सचित्र; लेकिन आप दोनों जगहों पर क्वेरी चला सकते हैं। या उन परिणामों के साथ एक अस्थायी तालिका बनाने और उन्हें यह क्वेरी के लिए उपलब्ध बनाने में शामिल होने ..

Select C from D inner join (Select A from B where...) C on C.1=D.1 where C like....

+0

मैंने दोनों स्थानों पर क्वेरी चलाने के बारे में सोचा, हाँ ... सबसे आसान तरीका) – Eddie

0

आप एक जहां में एक सबक्वेरी के परिणाम की तुलना मतलब है, तो हाँ आप यह कर सकते हैं।

select X ... where (select Y ...) = Z

हालांकि

, शायद एक बुरा विचार।आम तौर पर जब आपको ऐसा करना होता है, तो इसे मुख्य चयन में व्यवस्थित करने के तरीके को देखना सर्वोत्तम होता है। नेस्टेड प्रश्नों से बचने के लिए बहुत ही रचनात्मक तरीके हैं। इसका कारण यह है कि हर चयन को हर बार आंतरिक क्वेरी करना पड़ता है

यदि आप एक सबक्वायरी के खिलाफ कहां प्रदर्शन करते हैं, तो आप बस सभी का चयन करें और कहां आवेदन करें। हालांकि, फिर से, आप बस एक और आवेदन कर सकते हैं।

select X ... where Y = Z and A = B.

+0

मुझे पता है, यह एक अच्छा विचार नहीं है, लेकिन यह मेरे उद्देश्य के लिए सबसे अच्छा समाधान है। एक उत्तर के लिए धन्यवाद। – Eddie

+0

@ एडी मैं समझता हूं कि यह सबसे अच्छा समाधान प्रतीत हो सकता है। क्या मैं उस प्रश्न का एक उदाहरण देख सकता हूं जिसे आपको घोंसला करना चाहिए, इसलिए मैं देख सकता हूं कि इसे फिर से बनाया जा सकता है या नहीं? नेस्टेड ओ (एन) है, और यह असंभव रूप से बुरा हो जाता है। यदि नेस्टेड क्वेरी हर बार एक ही परिणाम उत्पन्न करती है, तो नेस्टेड का उपयोग करने की बिल्कुल आवश्यकता नहीं है। –

+0

मुझे "फ़ील्ड 1, फ़ील्ड 2, एसक्यूएल 3 फ़ील्ड 3, फ़ील्ड 4, एसक्यूएल 5 के रूप में फ़ील्ड 5 के रूप में फ़ील्ड 2 के रूप में फ़ील्ड 2 के रूप में चुनें, फ़ील्ड 2 = '...', field5 = '...' – Eddie

2

हालांकि यह वास्तव में वैध एसक्यूएल है:

SELECT D.A 
FROM D 
INNER JOIN B ON B.A = D.A 
+0

मैंने जॉइन के बारे में सोचा था। लेकिन इस तरह मेरे लिए भविष्य में कठिनाइयों को प्रदान करेगा। – Eddie

0

यह हमेशा बेहतर है:

select (select A from B where A = D.A) as C 
from D 

तुम बहुत बेहतर बंद कर रहे हैं (प्रदर्शन के लिहाज से) एक के बजाय शामिल हों लागू करने subquery के बजाय टेबल में शामिल होने के लिए। अर्थात Subquery:

SELECT id, (SELECT abc FROM t2 WHERE ID = user_id) as user_name FROM t1 

में शामिल हों:

SELECT c.id,u.abc FROM t1 as c LEFT JOIN t2 AS u ON u.ID = c.user_id WHERE 1=1 AND u.`user_login` = 'qwe123' 

अगर हम डाल करने की कोशिश जहां सबक्वेरी में खंड, यह त्रुटि फेंक देते हैं।

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