এসকিউএল স্পেসের কি উপস্থিতি () দ্বারা গ্রুপ প্রয়োজন?


11

মাইক্রোসফ্ট বর্তমানে এই সিনট্যাক্সের অনুমতি দেয়।

SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
  SELECT *
  FROM ( VALUES (1),(1) )
    AS t(x)
  WHERE g.x = t.x
  HAVING count(*) > 1
);

লক্ষ্য করুন যে GROUP BYএই EXISTSধারাটিতে কোনও নেই , তা কি বৈধ এএনএসআই এসকিউএল। বা এটি কেবল একটি বাস্তবায়নের বিশদ উন্মুক্ত করছে।

রেফারেন্সের জন্য, পোস্টগ্র্রেএসকিউএলে এই একই সিনট্যাক্সের অনুমতি নেই।

ত্রুটি: কলাম "tx" অবশ্যই গ্রুপ বা গ্রুপে উপস্থিত হতে হবে বা একটি সামগ্রিক ফাংশনে ব্যবহৃত হবে

তবে এই বাক্য গঠনটি অনুমোদিত ...

SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
  SELECT 1  -- This changed from the first query
  FROM ( VALUES (1),(1) )
    AS t(x)
  WHERE g.x = t.x
  HAVING count(*) > 1
);

এবং এই সিনট্যাক্স অনুমোদিত হয়।

SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
  SELECT *
  FROM ( VALUES (1),(1) )
    AS t(x)
  WHERE g.x = t.x
  GROUP BY t.x  -- This changed from the first query
  HAVING count(*) > 1
);

চ্যাটটিতে @ এরিকের সাথে কথোপকথন থেকে প্রশ্ন ওঠে

উত্তর:


11

আমি এটি এসকিউএল ২০১১ স্পেসে পেয়েছি ...

যদি <select list>"*" কেবলমাত্র একটিতে অন্তর্ভুক্ত থাকে <table subquery>যা অবিলম্বে একটিতে অন্তর্ভুক্ত থাকে <exists predicate>তবে এটি একটি স্বেচ্ছাসেবী <select list>হিসাবে সমান ।<value expression><literal>

এটি নিশ্চিত করে যে *এই প্রসঙ্গে একটি স্বেচ্ছাচারী আক্ষরিকের সমতুল্য না হয়ে এটি পোস্টগ্র্রেএসকিউএলটি অনুমানটিকে ভেঙে ফেলেছে।

এটি থেকে একটি স্বতন্ত্র সমস্যা মনে রাখবেন

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
HAVING count(*) > 1

যা উভয় ডাটাবেস প্রত্যাখ্যান করে।

পোস্টগ্রি

ত্রুটি: কলাম "tx" অবশ্যই গ্রুপ বা গ্রুপে উপস্থিত হতে হবে বা একটি সামগ্রিক ফাংশনে ব্যবহৃত হবে

SQL সার্ভার,

নির্বাচন করা তালিকায় কলাম 'টিএক্স' অবৈধ কারণ এটি কোনও সামগ্রিক ফাংশন বা গ্রুপ বাই গ্রুপের মধ্যে নেই।

কেন এই বাগ পোস্টগ্র্রেএসকিউএল এ টিকিয়ে রাখে

রাইডোম টোডকে irc.freenode.net/# পোস্টপ্রেস এসকিউএলকে ধন্যবাদ এই শুটিংয়ের জন্য তার সহায়তা করার জন্য। তিনি এই পরিস্থিতি সমাধানে অসুবিধাও দেখিয়েছেন

20:33 <রোডিয়ামটিড> একটি সমস্যা হ'ল পিজি তে আপনি বিদ্যমান থাকতে পারেন (ফানক নির্বাচন করুন) থেকে ... যেখানে ফানক () এমন একটি এসআরএফ যা 0 টি সারি ফিরে আসতে পারে

একটি এসআরএফ একটি সেট রিটার্নিং ফাংশন।

পোস্টগ্রেএসকিউএলে, আমরা উদাহরণস্বরূপ 1-10 থেকে একটি সিরিজ তৈরি করতে একটি এসআরএফ ব্যবহার করতে পারি ( generate_seriesমূলত)

SELECT * FROM generate_series(1,10); 

এবং, আমরা একইভাবে এটি এখানে রাখতে পারেন।

SELECT generate_series(1,10);

এর মধ্যে দু'জন মিলে আমাদের ক্রস-জয়েন (কারটিশিয়ান পণ্য) দেয়

SELECT generate_series(1,10), generate_series(1,2);

তবে, যদি এই দুটির মধ্যে 0-সারি ফিরে আসে তবে আপনি কিছুই পান না .. কার্যকরভাবে এটির মতোই

SELECT * FROM ( VALUES (1) ) AS t(x)
CROSS JOIN ( SELECT 1 LIMIT 0 ) AS g;

এবং এটি সম্পূর্ণরূপে এটি অনুকূল করে তোলার সমস্যা। আপনার কাছে একটি বিদ্যমান বক্তব্যের অভ্যন্তরের একটি বাছাই-তালিকায় একটি এসআরএফ থাকতে পারে যা 0-সারি প্রদান করে এবং অস্তিত্বকে মিথ্যাতে মূল্যায়ন করতে বাধ্য করে।

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