এই প্রশ্নের জন্য সঠিক ফলাফল কি?


20

আমি এখানে মন্তব্য এই ধাঁধা জুড়ে এসেছিলেন

CREATE TABLE r (b INT);

SELECT 1 FROM r HAVING 1=1;

এসকিউএল সার্ভার এবং পোস্টগ্রিসকিউএল 1 সারিতে ফিরে আসে।

মাইএসকিউএল এবং ওরাকল শূন্য সারি ফিরে আসে।

যা সঠিক? না উভয়ই সমানভাবে বৈধ?


দুর্দান্ত ধাঁধা আমি মনে করি সঠিক 1 সারি ফিরে আসা। এসকিউএল-সার্ভার নিজেকে বিরোধিতা করছে যদিও SELECT COUNT(*) FROM r;1 সারি (সহ 0) প্রদান করে, যখন SELECT COUNT(*) FROM r GROUP BY ();কোনও সারি দেয় না।
ypercubeᵀᴹ

1
আরো চাই? SELECT 1 WHERE 1=0 HAVING 1=1;এসকিউএল সার্ভার এবং পোস্টগ্রিসকিউএল এখনও একটি সারিতে ফিরে আসে। ওরাকল ডুয়াল থেকে চায় এবং কোনও সারি দেয় না। মাইএসকিউএল FROM DUAL বা এটি ব্যতীত কোনও সংকলন করে না ।
অ্যান্ড্রি এম

1
@ অ্যান্ড্রিএম কোনও অজানা কারণে মাইএসকিউএলে "দ্বৈত" এবং "হ্যাভিং" ভাল খেলছে না। (ভাল লাগছে)। তবে সমতুল্য কাজ করে: SELECT 1 AS t FROM (SELECT 1) tmp WHERE 1=0 HAVING 1=1; 1-সারি-নো-ডুয়াল এবং 0 টি সারি প্রদান করে।
ypercubeᵀᴹ

1
@ এসকিউএলকিউই - অনুমান থেকে এই উত্তরণ সম্পর্কে কি? "যদি TE অবিলম্বে একটি ধারণ করে না <group by clause>, তবে অন্তর্ভুক্ত “GROUP BY ()”is" উভয় প্রশ্নের কি একই ফলাফল ফেরত দেওয়া উচিত নয়?
মার্টিন স্মিথ

1
তবে এগুলির সাথে একমত নন (ওরাকল বিভিন্নভাবে কোয়েরিগুলি সম্পাদন করে HAVING): এসকিউএল-ফিডাল 2:
হ্যাভিং

উত্তর:


17

মান অনুযায়ী:

SELECT 1 FROM r HAVING 1=1

মানে

SELECT 1 FROM r GROUP BY () HAVING 1=1

তথ্যসূত্র আইএসও / আইইসি 9075-2: 2011 7.10 সিনট্যাক্স বিধি 1 (HAVING ধারাটির সংজ্ঞাটির অংশ):

দিন HCহতে <having clause>। দিন TEহতে <table expression>যে অবিলম্বে রয়েছে HC। যদি TEতাৎক্ষণিকভাবে একটি না থাকে <group by clause>তবে " GROUP BY ()" অন্তর্ভুক্ত। যাক Tটেবিল দ্বারা সংজ্ঞায়িত এর বর্ণনাকারী হতে <group by clause> GBCঅবিলম্বে অন্তর্ভুক্ত TEদিন Rফলও হতে GBC

ঠিক আছে তাই অনেক পরিষ্কার।


দৃser়তা: 1=1সত্য অনুসন্ধানের শর্ত। আমি এর জন্য কোনও প্রশংসাপত্র দেবো না।


এখন

SELECT 1 FROM r GROUP BY () HAVING 1=1

সমতুল্য

SELECT 1 FROM r GROUP BY ()

তথ্যসূত্র আইএসও / আইইসি 9075-2: 2011 7.10 সাধারণ বিধি 1:

<search condition>প্রতিটি দলের জন্য মূল্যায়ন করা হয় R। এর ফলাফল <having clause>হ'ল আর এর গ্রুপগুলির একটি গোষ্ঠীযুক্ত টেবিল যার জন্য ফলাফলটি <search condition>সত্য।

যুক্তিযুক্ত: যেহেতু অনুসন্ধানের শর্তটি সর্বদা সত্য, ফলাফলটি Rযা প্রকাশের দ্বারা গোষ্ঠীর ফলাফল।


নিম্নলিখিতটি 7..৯-এর সাধারণ বিধিগুলির একটি সংক্ষিপ্তসার (ক্লাস দ্বারা গ্রুপের সংজ্ঞা)

1) যদি <where clause>নির্দিষ্ট করা না থাকে তবে Tপূর্বের ফলাফল হোক <from clause>; অন্যথায়, Tপূর্বের ফলাফল হতে দিন <where clause>

2) কেস:

ক) যদি কোনও গোষ্ঠীভুক্ত কলাম না থাকে তবে এর ফলাফলটি কেবলমাত্র গ্রুপ হিসাবে <group by clause>গঠিত গোষ্ঠীযুক্ত টেবিল T

সুতরাং আমরা এটি উপসংহার করতে পারেন

FROM r GROUP BY ()

শূন্য সারি সহ একটি গোষ্ঠী সমন্বিত একটি গোষ্ঠীযুক্ত টেবিলের ফলাফল (যেহেতু আর খালি)।


7.12 এর সাধারণ বিধিগুলির একটি সংক্ষিপ্তসার, যা কোয়েরি স্পেসিফিকেশন (ওরফে একটি নির্বাচনী বিবৃতি) সংজ্ঞায়িত করে:

1) কেস:

ক) যদি Tগোষ্ঠীযুক্ত টেবিল না হয় তবে [...]

খ) যদি Tএকটি দলবদ্ধ টেবিল হয়, তবে

কেস:

i) যদি T0 (শূন্য) গোষ্ঠী থাকে, তবে TEMP কে একটি খালি টেবিল হতে দিন।

ii) যদি Tএক বা একাধিক গ্রুপ থাকে তবে প্রত্যেকটি একটি টেবিল ফলনের <value expression>প্রতিটি গ্রুপে প্রয়োগ করা হয়TTEMP এর Mসারি, যেখানে Mদলের সংখ্যা TiTEMP এর -th কলাম মান মূল্যায়ন দ্বারা প্রাপ্ত রয়েছে i-th <value expression>। [...]

2) কেস:

ক) যদি <set quantifier> DISTINCT সুনির্দিষ্ট না হয়, তবে ফলাফলটি <query specification>হয় TEMP

সুতরাং যেহেতু টেবিলের একটি গ্রুপ রয়েছে, এর অবশ্যই একটি ফলাফল সারি থাকা উচিত।

এইভাবে

SELECT 1 FROM r HAVING 1=1

1 টি সারির ফলাফল সেটটি ফেরত দেওয়া উচিত।

Qed


+1 সমস্ত ঝামেলাতে যাওয়ার জন্য ধন্যবাদ! যেমন @ টাইপকিউবে বলা হয়েছে যে এসকিউএল সার্ভারটি এখানে নিজের থেকে গ্রুপ 1 (1) হিসাবে নির্বাচন করুন হিসাবে বিপরীত বলে মনে হচ্ছে; শূন্য সারি প্রদান করে তবে আপনি যে উদ্ধৃতিটি উদ্ধৃত করেছেন তা এই পয়েন্টে বেশ স্পষ্ট বলে মনে হচ্ছে।
মার্টিন স্মিথ

আমি জিজ্ঞাসা করতে পারি আপনি কোথায় মান খুঁজে পেয়েছেন? যদি আপনি 'আমার বইয়ের তাক' বলে থাকেন তবে আমি হতাশ হব :)
dezso

প্রযুক্তিগতভাবে আমি স্ট্যান্ডার্ডের চেয়ে চূড়ান্ত খসড়া আন্তর্জাতিক স্ট্যান্ডার্ড ব্যবহার করেছি। আইএসও / আইসির নিয়ম অনুসারে এফডিআইএস এবং চূড়ান্ত মানকগুলির মধ্যে কেবল সম্পাদকীয় (অ-প্রযুক্তিগত) পরিবর্তনের অনুমতি রয়েছে। মান একাধিক অংশে থুতু হয়। পর্ব 1 , পর্ব 2 , ভাগ 4 ...
কেভিন ক্যাথকার্ট

অংশ 11 , এবং 14 ভাগ । অংশগুলি 3,9,10 এবং 13 টি আপডেট করা হয়নি 2011 এবং এর ফলে তাদের পূর্ববর্তী সংস্করণগুলি প্রযোজ্য। কোন অংশ নেই 12 একইভাবে কোন অংশ 5-8 আছে। প্রতিটি অংশে কী রয়েছে তার ব্যাখ্যার জন্য SQL: 2011 বা খণ্ড খণ্ড 1 এর উইকিপিডিয়া পৃষ্ঠা দেখুন ।
কেভিন ক্যাথকার্ট

7

যখন কোনও HAVINGধারা আছে, কোনও WHEREধারা ছাড়াই :

SELECT 1 FROM r HAVING 1=1;

... তারপর GROUP BY ()নিহিত। সুতরাং, ক্যোয়ারির সমতুল্য হওয়া উচিত:

SELECT 1 FROM r GROUP BY () HAVING 1=1;

... যা টেবিলের সমস্ত সারি এক গোষ্ঠীতে বিভক্ত করা উচিত (যদিও টেবিলটির কোনও সারি নেই - এটি এখনও 0 টি সারির একটি গ্রুপ) এবং 1 সারি ফিরে আসে। HAVINGসঙ্গেTrue এই শর্তে যে পরে সব সময়ে কোন প্রভাব থাকা উচিত।


ভিন্ন কোণ থেকে, এই রিটার্নের মতো একটি ক্যোয়ারীতে কতগুলি সারি হওয়া উচিত?

SELECT COUNT(*), MAX(b) FROM r;

এক, শূন্য বা "শূন্য বা এক, তার উপর নির্ভর করে টেবিলটি খালি আছে কিনা"?

আমি মনে করি এক সারি, কত সারি rরয়েছে তা বিবেচনা করে না।


তবে মূল বিষয়টি হ'ল এটি সত্য যে "টেবিলে কোনও সারি না থাকলেও এটি 0 টি সারির একটি গ্রুপ"। এবং স্ট্যান্ডার্ডটি এ সম্পর্কে সুস্পষ্ট হয়ে দাঁড়ায়: "যদি কোনও গ্রুপিং কলাম না থাকে, তবে ... এটি টি এর একমাত্র গোষ্ঠী হিসাবে গঠিত গোষ্ঠীযুক্ত টেবিল"। (এবং এটি টি খালি থাকলেও ধারণ করে - সুতরাং প্রকৃতপক্ষে একটি গ্রুপ রয়েছে)) আরও পরবর্তী শর্তটি উল্লেখ করে যে শর্তটি প্রতিটি গ্রুপের জন্য প্রয়োগ করা হয়েছে (উদাহরণস্বরূপ এইভাবে একবার)। তারা সম্ভবত এসএমএম এবং COUNT টি খালি টি এর জন্য এক সারি ফেরত দেওয়ার জন্য এটি এইভাবে সংজ্ঞায়িত করেছেন।
এরউইন স্মাউট

+1 (আগের!) যদিও আপনার যুক্তিটি কেভিনের মত একই তবে আমি তার উত্তরটি গ্রহণ করেছি কারণ স্পষ্টভাবে উদ্ধৃতি দিয়েছি। ধন্যবাদ!
মার্টিন স্মিথ

@MartinSmith। Thnx। যেটি আমি অলস হতে
পেলাম

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

3
@ ইরুইনস্মাউট: অবশ্যই না। তবে এটি মার্কিন কপিরাইট আইনে ন্যায্য ব্যবহারের মধ্যে পড়ে। তুলনামূলকভাবে ছোট অংশগুলি, কাজের উদ্দেশ্যে বিশ্লেষণের (অর্থাৎ সমালোচনা) প্রসঙ্গে শিক্ষামূলক উদ্দেশ্যে, বিক্রির ক্ষমতার উপর ক্ষুদ্র প্রভাব ফেলে।
কেভিন ক্যাথকার্ট

3

আমি যা দেখছি তা থেকে দেখে মনে হচ্ছে এসকিউএল সার্ভার এবং পোস্টার এসকিউএল কোনও টেবিলটি দেখতে মোটেই বিরক্ত করবেন না:

CREATE TABLE r (b INT);
insert into r(b) values (1);
insert into r(b) values (2);
SELECT 1 FROM r HAVING 1=1;

এছাড়াও মাত্র এক সারি ফিরে আসে। যদিও এসকিউএল সার্ভার ডকস বলে

যখন গ্রুপ বাই ব্যবহার করা হয় না তখন হওয়িং একটি সম্পূর্ণ ধারাটির মতো আচরণ করে।

এটি এই ক্ষেত্রে সত্য নয় - WHERE 1=1পরিবর্তে HAVINGসারিগুলির যথাযথ সংখ্যা ফেরত দেয়। আমি বলতে চাই এটি অপ্টিমাইজার বাগ (বা কমপক্ষে ডকুমেন্টেশন বাগ) ... এসকিউএল সার্ভার পরিকল্পনাটি 'কনস্ট্যান্ট স্ক্যান' দেখায়HAVING এবং 'টেবিল স্ক্যান' এরWHERE ...

ওরাকল এবং মাইএসকিএল আচরণটি আমার কাছে আরও যুক্তিযুক্ত এবং সঠিক বলে মনে হচ্ছে ...


1
আপনি ঠিক বলেছেন যে এসকিউএল সার্ভারটি টেবিলটির দিকে তাকাবে না। কার্যকর করার পরিকল্পনার কেবল একটি ধ্রুবক স্ক্যান রয়েছে এবং এটি সারণীটিও উল্লেখ করে না। এটি যদি কেবলমাত্র এসকিউএল সার্ভার হত তবে আমি কেবল এটি একটি বাগে রেখে দিয়েছি তবে এটি কেবল এসকিউএল সার্ভার নয় বলে আমি ভাবছি যে এখানে কিছু আসল অস্পষ্টতা আছে কিনা।
মার্টিন স্মিথ

পোস্টগ্রেএসকিউএল এসকিউএল সার্ভারের মতো একই ফলাফলগুলি প্রদর্শন করে এবং যতদূর আমি explain"ফলাফল (সারি = 1) ..." এর আউটপুট থেকে বলতে পারি এবং "যেখানে" এর জন্য "সিক স্ক্যান" এটি সারণীতেও দেখেনি। .. আমার ধারণা এটি কোনওভাবে এই সত্যের সাথে সম্পর্কিত যে টিএসকিউএল এবং পোস্টগ্রিএসকিউএলে "FROM" বাধ্যতামূলক নয়। আমি জানি যে মাইকিউএলএরও এটির প্রয়োজন হয় না, তবে যেহেতু তারা সমর্থন করে dual, তারা সম্ভবত কোয়েরিকে কিছুটা আলাদা করে। আমি একমত, এটি অনুমান হিসাবে মনে হচ্ছে, তবে আমি আশা করি এটি কিছুটা অর্থপূর্ণ হবে।
a1ex07
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.