মাইএসকিউএল "উইথ" ক্লজ


98

আমি "WITH" ধারাটি দিয়ে একটি ভিউ তৈরি করতে মাইএসকিউএল ব্যবহার করার চেষ্টা করছি

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname

তবে মাইএসকিউএল এটি সমর্থন করে বলে মনে হয় না।

আমি ভেবেছিলাম এটি বেশ স্ট্যান্ডার্ড এবং আমি নিশ্চিত ওরাকল এটি সমর্থন করে। মাইএসকিউএলকে "WITH" ধারাটি ব্যবহার করতে বাধ্য করার কি কোনও উপায় আছে? আমি এটি মাইআইএসএএম এবং নির্দোষ ডিবি ইঞ্জিন দিয়ে চেষ্টা করেছি। এই দুটোই কাজ করে না।

উত্তর:


109

আপডেট: মাইএসকিউএল 8.0 শেষ পর্যন্ত পুনরাবৃত্ত সিটিই সহ সাধারণ সারণী এক্সপ্রেশনগুলির বৈশিষ্ট্য পাচ্ছে।

এটির ঘোষণা দিয়ে এখানে একটি ব্লগ এসেছে: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

নীচে আমার আগের উত্তরটি দেওয়া হয়েছে, যা আমি মূলত ২০০৮ সালে লিখেছিলাম।


মাইএসকিউএল ৫.০ WITHএসকিউএল -৯৯ এ সংজ্ঞায়িত সিনট্যাক্স ব্যবহার করে ক্যোয়ারী সমর্থন করে না , এটি সাধারণ টেবিল এক্সপ্রেশনও বলে।

এটি জানুয়ারী ২০০ since সাল থেকে মাইএসকিউএলের জন্য একটি বৈশিষ্ট্য অনুরোধ: http://bugs.mysql.com/bug.php?id=16244

অন্যান্য আরডিবিএমএস পণ্য যা সাধারণ টেবিলের অভিব্যক্তিগুলিকে সমর্থন করে:


4
এসকিউএলাইট 2014-02-03 এ প্রকাশিত সংস্করণ 3.8.3 হিসাবে WITH ধারাটি সমর্থন করে ।
মার্টিজন

আমি এইচ 2 এবং ফায়ারবার্ড তালিকায় যুক্ত করেছি।
a_horse_with_no_name

4
@ বিলকারভিন: আমি বিশ্বাস করি না যে মাইএসকিউএল কোনও আধুনিক ডিবিএমএস বৈশিষ্ট্য (চেক সীমাবদ্ধতা, উইন্ডো ফাংশন, এক্সপ্রেশনের সূচক, আংশিক সূচক, স্থগিত বাধা ...) প্রয়োগ করবে ।
a_horse_with_no_name

4
@ এ_হর্স_বিহীন_নাম_নাম, তারা স্কেলাবিলিটির উপরে অনেক বেশি অগ্রাধিকার দেবে বলে মনে হয়। তারা আধুনিক হার্ডওয়্যারটির সুযোগ নিতে তাদের অভ্যন্তরগুলি আরও স্কেলযোগ্য করে তোলার জন্য দীর্ঘ সময় ধরে মনোনিবেশ করেছে। তবে আমি মনে করি তারা এসকিউএল বৈশিষ্ট্যগুলি অবহেলা করেছে।
বিল কারভিন

4
@ ব্ল্যাকম্যাক ব্রাইড, আপনি ভুল, আপনার মন্তব্যটি এফইউডি এবং বাস্তবে এর কোনও ভিত্তি নেই। ওরাকল এমন অন্যান্য ডাটাবেস পণ্যগুলিরও মালিকানাধীন যেগুলি এমন কাজ করে যা ওরাকল ডিবি ভাল করে না। উদাহরণ: টাইমসটেন, বার্কলেডিবি। তারা তাদের বাজার প্রসারিত করতে সেই ডাটাবেসগুলি অর্জন করেছিল। ওয়েব অ্যাপ্লিকেশন বাজারে মাইএসকিউএল প্রভাবশালী এবং ওরাকল ডিবি নেই, তাই তারা মাইএসকিউএল অর্জন করেছে। এটি ওরাকলকে মাইএসকিউএল হ্যামস্ট্রিংয়ের কোনও মানে করে না। এপ্রিলে সম্মেলনে আমি ওরাকল মাইএসকিউএল বিকাশকারীদের সাথে কথা বলেছিলাম এবং তারা আসলে মাইএসকিউএল-এর সাহায্যে বাস্তবায়নে কাজ করছে।
বিল কারভিন

17

আপনি কিছুটা এই বিষয়ে আগ্রহী হতে পারেন:

select * from (
    select * from table
) as Subquery

আপনি subquery ব্যাখ্যা করতে পারেন দয়া করে? আমি কি (* টেবিল 1 থেকে * নির্বাচন করুন) ইউনিয়ন সমস্ত (টেবিল 2 থেকে * নির্বাচন করুন) গ্রুপটি কিছু দিয়ে বেছে নিতে পারি?

4
@ ক্যাথি হাই, Subqueryআমি সেই নাম যা আমি নিজেই প্রাপ্ত টেবিলের জন্য ব্যবহার করেছি। আপনি যখন ব্যবহার করেন from ( ... )আপনি অস্থায়ী টেবিলের মতো কিছু তৈরি করেন (উত্পন্ন টেবিল) এবং এর একটি নাম প্রয়োজন। এজন্যই আমি ব্যবহার করেছি as Subquery। আপনার প্রশ্নের উত্তর দিয়ে, হ্যাঁ, আপনি পারেন তবে আপনাকে বাইরের উত্পন্ন টেবিলের (নাম ঠিক আগে Group By) নাম লিখতে হবে । আশা করি যে সাহায্য করেছে।
মোস্তি মোস্তাচো

@ মোস্টিমোস্টাচো হ্যালো, আমাকে এখানে একটু চামচ খাওয়াতে পারেন? আমি এটিকে মাইএসকিউএলে রূপান্তর করতে সংগ্রাম করছি। আপনি কি এটি একবার দেখে নিতে পারেন? এখানে লিঙ্ক বা আমার প্রশ্নের উত্তর সম্ভবত? লিঙ্ক
প্রণব

13

আপনার সিনট্যাক্সটি ঠিক আছে:

WITH AuthorRating(AuthorName, AuthorRating) AS
   SELECT aname         AS AuthorName,
          AVG(quantity) AS AuthorRating
   FROM Book
   GROUP By Book.aname

তবে অন্যরা যেমন বলেছে, মাইএসকিউএল এই আদেশটি সমর্থন করে না। এসকিউএল এর সাথে যুক্ত করা হয়েছিল: 1999; এসকিউএল স্ট্যান্ডার্ডের নতুন সংস্করণটি এসকিউএল: ২০০৮। এসকিউএল: 1999 এর বিভিন্ন বৈশিষ্ট্যগুলি উইকিপিডিয়ায় সমর্থন করে এমন ডেটাবেস সম্পর্কে আপনি আরও কিছু তথ্য পেতে পারেন ।

মাইএসকিউএল forতিহ্যগতভাবে এসকিউএল স্ট্যান্ডার্ডের জন্য কিছুটা পিছিয়ে রয়েছে, অন্যদিকে ওরাকল, এসকিউএল সার্ভার (সম্প্রতি) এবং ডিবি 2 এর মতো বাণিজ্যিক ডাটাবেসগুলি এটিকে কিছুটা আরও ঘনিষ্ঠভাবে অনুসরণ করেছে। পোস্টগ্রাইএসকিউএল সাধারণত বেশিরভাগ মান সম্মত হয়।

আপনি মাইএসকিউএল এর রোডম্যাপটি দেখতে চাইতে পারেন; এই বৈশিষ্ট্যটি কখন সমর্থিত হতে পারে তা আমি পুরোপুরি নিশ্চিত নই, তবে পঠনযোগ্য রোল-আপ অনুসন্ধান তৈরি করার জন্য এটি দুর্দান্ত।


11

ওরাকল তার সাথে সমর্থন করে।

এটি দেখতে এই মত হবে।

WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'

@ysth এর সাথে গুগল করা কঠিন কারণ এটি একটি সাধারণ শব্দ যা সাধারণত অনুসন্ধান থেকে বাদ থাকে।

সাবকিউরি ফ্যাক্টরিং কীভাবে কাজ করে তা দেখতে আপনি নির্বাচনী নথিতে সন্ধান করতে চাইবেন ।

আমি জানি এটি ওপিটির উত্তর দেয় না তবে আমি যে কোনও বিভ্রান্তি পরিষ্কার করে দিচ্ছি যেটি শুরু হয়েছে।


যাইহোক আমার বিভ্রান্তি পরিষ্কার করেনি। আপনি কি বলছেন যে এখানে একটি বিধি নেই তবে সেখানে একটি বিবৃতি রয়েছে?
ইস্ট

4
আহ আমি দেখি. এটি একটি নির্বাচনের একটি ধারা যা নির্বাচনের আগে। এটিও ক্রিয়েট ভিউতে ব্যবহার করা যেতে পারে? সাবক্লটে যোগ দেওয়া থেকে এটি কীভাবে আলাদা? আমি অনলাইনে উদাহরণগুলি দেখতে পাচ্ছি না যেখানে ডাব্লুটির নাম অনুসারে প্যারামিটার রয়েছে - সেগুলি কীভাবে কাজ করে?
ইস্ট

4
এটা খুব আলাদা। লক্ষ্য করুন যে একই subqry দু'বার সংজ্ঞায়িত না করে দুবার ব্যবহৃত হয়। নিশ্চিত যে আপনি সেখানে একই ক্যোয়ারীটি অনুলিপি / পেস্ট করতে পারেন তবে এটি একটি সহজ উদাহরণ। কল্পনা করুন যে WITH ধারাটি যদি কোনও পৃষ্ঠার জন্য যায় এবং মূল ক্যোয়ারিতে 4 বার ব্যবহৃত হয়। আপনি তখন এটি প্রশংসা করব।

আমি ডক্সের সাথে লিঙ্ক করেছি, তার বাক্য গঠনটি ব্যাখ্যা করা উচিত। যতদূর দেখা যায়। অবশ্যই এটি সেখানে কাজ করে।

3

@ মোস্টি মোস্তাচো-এর উত্তরের উপর ভিত্তি করে তৈরি করা, আপনি কীভাবে মাইএসকিউএলে সমমানের কিছু করতে পারেন তা সুনির্দিষ্ট ক্ষেত্রে, কোন টেবিলে কোন এন্ট্রি বিদ্যমান নেই এবং এটি অন্য কোনও ডাটাবেসে নেই তা নির্ধারণের নির্দিষ্ট ক্ষেত্রে।

select col1 from (
   select 'value1' as col1 union
   select 'value2' as col1 union
   select 'value3' as col1
) as subquery
left join mytable as mytable.mycol = col1
where mytable.mycol is null
order by col1

উদ্ধৃত নির্বাচনের ইউনিয়ন ধারাতে মানগুলির তালিকা রূপান্তর করতে আপনি ম্যাক্রো ক্ষমতা সহ একটি পাঠ্য সম্পাদক ব্যবহার করতে পারেন।




0

আপনি কি কখনও অস্থায়ী টেবিল চেষ্টা করেছেন? এটি আমার কভারভার সমাধান করেছে:

create temporary table abc (
column1 varchar(255)
column2 decimal
);
insert into abc
select ...
or otherwise
insert into abc
values ('text', 5.5), ('text2', 0815.8);

তারপরে আপনি এই সেশনে প্রতিটি নির্বাচনের ক্ষেত্রে এই টেবিলটি ব্যবহার করতে পারেন:

select * from abc inner join users on ...;

4
আমার খেয়াল রাখতে হবে: stackoverflow.com/questions/343402/… আপনি দুবার টেবিল খুলতে পারবেন না :-(
ক্লজ

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