ভিউ'র SELECT এ FROM ধারাটিতে একটি সাবকোয়ারি রয়েছে


111

আমার দুটি টেবিল রয়েছে এবং আমার একটি ভিউ তৈরি করা দরকার। টেবিলগুলি হ'ল:

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

এটি করার জন্য আমি নিম্নলিখিত কোয়েরিটি ব্যবহার করি। "ভিউ তৈরি করুন" অংশ ব্যতীত ক্যোরিয়ামটি ভাল কাজ করে তবে "ভিউ তৈরি করুন" এর সাথে এটি ত্রুটিটি দেখায় "ভিউ'র SELECT এ FROM ধারাটিতে একটি সাবকিউরি রয়েছে" contains সমস্যা এবং সম্ভাব্য সমাধান কী হতে পারে:

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)


@ ম্যাটফেনউইক, এটি নয় - এই ক্যোয়ারীটি সহজেই আবার লেখা যেতে পারে, যা সাধারণভাবে সম্ভব নয়
টিএমএস

সাবকিউরিগুলি মেরিডবিতে 10.2সংস্করণ 10.2.1দেখুন - jira.mariadb.org/browse/MDEV-3944
আদর্শ মাদ্রেচা

উত্তর:


156

ডকুমেন্টেশন অনুসারে:

মাইএসকিউএল ডক্স

  • নির্বাচনী বিবৃতিতে এফআরওএম ক্লজটিতে একটি সাবকোয়ারি থাকতে পারে না।

আপনার কর্মক্ষেত্রটি হ'ল আপনার প্রতিটি সাবকিউয়ের জন্য একটি ভিউ তৈরি করা।

তারপরে আপনার দর্শন থেকে এই দর্শনগুলি অ্যাক্সেস করুন view_credit_status


17
নোট করুন যে নেস্টিং দর্শনগুলি গুরুতর পারফরম্যান্স জরিমানার কারণ হতে পারে।
মাইগুয়েলকোবাইন

1
@ মিগুয়েলকোবাইন, কেবল বাসা বাঁধার জন্য একটি নতুন ভিউ তৈরি করা আপনার "গম্ভীর পারফরম্যান্স পেনাল্টি" মুছে ফেলবে না। তাহলে কি দেয়?
পেসারিয়ার

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

দেখার সীমাবদ্ধতার উপর আরও সাম্প্রতিক মাইএসকিউএল ডকুমেন্টেশন হিসাবে বলা হয়েছে:

মাইএসকিউএল ৫.7. Before এর আগে, সাবউকুইরিগুলি কোনও দৃশ্যের FROM ধারাতে ব্যবহার করা যাবে না।

এর অর্থ হ'ল, কোনও মাইএসকিউএল ভি .7..7. or বা আরও নতুন নির্বাচন করা বা বিদ্যমান মাইএসকিউএল উদাহরণটি এ জাতীয় সংস্করণে আপগ্রেড করা, দর্শনগুলির উপর এই বিধিনিষেধকে পুরোপুরি সরিয়ে ফেলবে।

তবে, যদি আপনার কাছে বর্তমান উত্পাদন মাইএসকিউএল সংস্করণ রয়েছে যা ভি 5.7.7 এর চেয়ে আগের, তবে ভিউগুলিতে এই বিধিনিষেধটি অপসারণ করা কেবলমাত্র আপগ্রেড করার বা সিদ্ধান্ত নেওয়ার সিদ্ধান্ত নেওয়ার সময় মূল্যায়নের অন্যতম একটি হওয়া উচিত। অন্যান্য উত্তরে বর্ণিত কাজের কৌশলগুলি ব্যবহার করা আরও কার্যকর সমাধান হতে পারে - কমপক্ষে সংক্ষিপ্ততম রান চালানোর ক্ষেত্রে।


0

আমার কাছে মাইএসকিউএল ৩.6 হিসাবে নীচের ত্রুটিটি দেয় যখন মাইএসকিউএল ৩.7 আর ত্রুটি না করে। এই ফিক্সটি সংক্রান্ত ডকুমেন্টেশনে আমি এখনও কিছু খুঁজে পাচ্ছি না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.