क्या SQL युक्ति को EXISTS () में एक GROUP BY की आवश्यकता है


11

Microsoft वर्तमान में इस सिंटैक्स की अनुमति देता है।

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, यह मान्य ANSI SQL है। या यह केवल एक कार्यान्वयन विवरण को उजागर कर रहा है।

संदर्भ के लिए, PostgreSQL में इसी सिंटैक्स की अनुमति नहीं है।

त्रुटि: कॉलम "tx" को ग्रुप BY क्लॉज में प्रकट होना चाहिए या एक समग्र फ़ंक्शन में उपयोग किया जाना चाहिए

लेकिन इस वाक्यविन्यास की अनुमति है ..

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
);

चैट में @ErikE से बातचीत से सवाल उठता है

जवाबों:


11

मैंने इसे SQL 2011 कल्पना में पाया ...

यदि <select list>"*" बस एक <table subquery>में समाहित है <exists predicate>, तो तुरंत एक में समाहित है , तो यह <select list>एक के बराबर <value expression>है एक मनमाना है <literal>

यह *इस संदर्भ में एक मनमाना शाब्दिक के बराबर नहीं होने की पुष्टि करता है कि यह वास्तव में PostgreSQL कल्पना को तोड़ रहा है।

ध्यान रखें कि यह एक अलग समस्या है

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

जिसे दोनों डेटाबेस अस्वीकार करते हैं।

PostgreSQL,

त्रुटि: कॉलम "tx" को ग्रुप BY क्लॉज में प्रकट होना चाहिए या एक समग्र फ़ंक्शन में उपयोग किया जाना चाहिए

एस क्यू एल सर्वर,

कॉलम 'tx' चुनिंदा सूची में अमान्य है क्योंकि यह किसी समुच्चय या समूह BY खंड में समाहित नहीं है।

क्यों यह बग PostgreSQL में बनी रहती है

थैंक्स RhodiumToad पर irc.freenode.net/#PostgreSQL पर जाता है ताकि वह इसे शूट करने में मदद कर सके। वह इस स्थिति को हल करने में कठिनाई को भी इंगित करता है

20:33 <रोडियामटॉड> एक समस्या यह है कि पीजी में आप मौजूद हो सकते हैं (सेलेक्ट फंक () ... जहाँ फंक () एक एसआरएफ है जो 0 पंक्तियों को वापस ला सकता है।

एक SRF एक सेट रिटर्निंग फंक्शन है।

PostgreSQL में, हम उदाहरण के लिए एक SRF का उपयोग 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;

और, यह पूरी तरह से इस अनुकूलन के साथ समस्या है। आपके पास एक एक्स्टैट स्टेटमेंट के अंदर एक SRF हो सकता है जो 0-पंक्तियों को लौटाता है, और EXISTS को गलत का मूल्यांकन करने के लिए मजबूर करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.