व्यू के चयन में FROM क्लॉज में एक उपश्रेणी शामिल है


111

मेरे पास दो टेबल हैं और मुझे एक दृश्य बनाने की आवश्यकता है। टेबल हैं:

credit_orders(id, client_id, number_of_credits, payment_status)
credit_usage(id, client_id, credits_used, date)

मैं ऐसा करने के लिए निम्नलिखित क्वेरी का उपयोग करता हूं। "क्रिएट व्यू" भाग के बिना क्वेरी अच्छी तरह से काम करती है, लेकिन "क्रिएट व्यू" के साथ, यह त्रुटि दिखाता है "व्यू के चयन में FROM क्लॉज में एक उपश्रेणी शामिल है"। मुद्दा और संभव समाधान क्या हो सकता है:

create view view_credit_status as 
(select credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
 from credit_orders
 left outer join (select * from (select credit_usage.client_id, 
                                        sum(credits_used) as credits_used 
                                 from credit_usage 
                                 group by credit_usage.client_id) as t0
                  ) as t1 on t1.client_id = credit_orders.client_id
 where credit_orders.payment_status='Paid'
 group by credit_orders.client_id)


@MattFenwick, नहीं, यह नहीं है - उस क्वेरी को आसानी से फिर से लिखा जा सकता है, जो सामान्य रूप से संभव नहीं है
TMS

10.2संस्करण से सबडिरीज को मारीडब में समर्थित किया जाता है 10.2.1देखें - jira.mariadb.org/browse/MDEV-3944
आदर्श मादरेचा

जवाबों:


157

प्रलेखन के अनुसार:

MySQL डॉक्स

  • सेलेक्ट स्टेटमेंट में FROM क्लॉज में एक उपश्रेणी नहीं हो सकती है।

आपका काम आपके प्रत्येक उप-वर्ग के लिए एक दृश्य बनाना होगा।

फिर उन दृश्यों को अपने दृश्य में से एक्सेस करें view_credit_status


17
ध्यान दें कि घोंसले के शिकार का कारण गंभीर प्रदर्शन दंड हो सकता है।
मिगुएलकोबैन

1
@miguelcobain, केवल एक घोंसले के लिए एक नया दृश्य बनाना यह "गंभीर प्रदर्शन दंड" को दूर नहीं करता है जिसके बारे में आप बात कर रहे हैं। तो क्या देता है?
पचेरियर

28
अब 5.7 में अनुमति दी गई! :-)
फ्रांस्वा ब्रेटन

4
मारियाडीबी में अनुमति नहीं है
पीटर

16
create view view_clients_credit_usage as
    select client_id, sum(credits_used) as credits_used 
    from credit_usage 
    group by client_id

create view view_credit_status as 
    select 
        credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
    from credit_orders
    left outer join view_clients_credit_usage as t1 on t1.client_id = credit_orders.client_id
    where credit_orders.payment_status='Paid'
    group by credit_orders.client_id)

13

दृश्य प्रतिबंधों के बारे में अधिक हाल ही में MySQL के दस्तावेज कहते हैं:

MySQL 5.7.7 से पहले, उपकेंद्रों को किसी दृश्य के FROM क्लॉज में उपयोग नहीं किया जा सकता है।

इसका मतलब है, कि एक MySQL v5.7.7 को चुनना या नए या मौजूदा MySQL उदाहरण को इस तरह के संस्करण में अपग्रेड करना, इस प्रतिबंध को पूरी तरह से विचारों पर हटा देगा।

हालांकि, यदि आपके पास एक वर्तमान उत्पादन MySQL संस्करण है जो v5.7.7 से पहले है, तो विचारों पर इस प्रतिबंध को हटाने के लिए केवल एक मापदंड होना चाहिए, जबकि एक निर्णय किया जाना चाहिए कि उन्नयन या नहीं। अन्य उत्तरों में वर्णित वर्कअराउंड तकनीकों का उपयोग करना अधिक व्यवहार्य समाधान हो सकता है - कम से कम छोटे रन पर।


0

MySQL 3.6 के रूप में मुझे लगता है कि निम्नलिखित त्रुटि देता है जबकि MySQL 3.7 अब कोई त्रुटि नहीं है। मुझे इस फ़िक्स के संबंध में अभी तक कुछ भी नहीं मिला है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.