2011-12-08 10 views
85

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

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

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

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) 
+0

संभव डुप्लिकेट [MySQL: खण्ड से सीमा में Subquery के साथ देखें] (http://stackoverflow.com/questions/206062/mysql-view-with-subquery-in-the-from-clause-limitation) –

+0

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

+0

सबक्विरी संस्करण '10.2.1' संस्करण से मारियाडब '10.2' में समर्थित हैं - https://jira.mariadb.org/browse/एमडीईवी -3944 –

उत्तर

130

प्रति प्रलेखन के रूप में::

MySQL Docs

  • SELECT कथन FROM खंड में एक सबक्वेरी शामिल नहीं हो सकता क्या मुद्दा & संभव समाधान हो सकता है।

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

फिर view restrictions पर आपके विचार view_credit_status

+14

ध्यान दें कि घोंसले के दृश्य गंभीर प्रदर्शन दंड का कारण बन सकते हैं। – miguelcobain

+1

@ मिगुएलकोबेन, सिर्फ घोंसले के लिए एक नया दृश्य बनाना यह "गंभीर प्रदर्शन दंड" को नहीं हटाता है जिसके बारे में आप बात कर रहे हैं। तो क्या देता है? – Pacerier

+16

अब 5.7 में अनुमति है! :-) –

13
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) 
5

के भीतर से उन दृश्यों का उपयोग अधिक हाल ही में MySQL प्रलेखन के रूप में कहते हैं:

MySQL 5.7.7 से पहले, सबक्वेरी में नहीं किया जा सकता FROM खंड एक दृश्य के

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

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

0

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

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