आपकी क्वेरी पूरी तरह से कानूनी वाक्यविन्यास है, आप उन स्तंभों के आधार पर आदेश दे सकते हैं जो चयन में मौजूद नहीं हैं।
- MySQL के साथ कार्य करना डेमो
- SQL सर्वर के साथ कार्य करना डेमो
- Postgresql के साथ वर्किंग डेमो
- SQLite के साथ कार्य करना डेमो
- Oracle के साथ वर्किंग डेमो
यदि आपको कानूनी आदेश के बारे में पूर्ण विनिर्देशों की आवश्यकता है, तो SQL मानक 2003 में इसमें कथनों की एक लंबी सूची है कि आदेश में क्या होना चाहिए और क्या नहीं होना चाहिए, (02-फाउंडेशन, पृष्ठ 415, खंड 7.13 <क्वेरी अभिव्यक्ति>, उप भाग 28)। यह पुष्टि करता है कि आपकी क्वेरी कानूनी सिंटैक्स है।
मुझे लगता है कि आपका भ्रम समूह में मौजूद नहीं कॉलम द्वारा चयन, और/या ऑर्डर करने से उत्पन्न हो सकता है, या अलग-अलग उपयोग करते समय चयन में नहीं कॉलम द्वारा ऑर्डर कर सकता है।
दोनों में एक ही मूलभूत समस्या है, और मेरी जानकारी में केवल MySQL ही ऐसा है जो दोनों में से किसी को भी अनुमति देता है।
समस्या यह है कि समूह द्वारा या विशिष्ट का उपयोग करते समय, किसी भी कॉलम में शामिल नहीं होने की आवश्यकता नहीं होती है, इसलिए इससे कोई फर्क नहीं पड़ता कि उनके पास पंक्तियों में कई अलग-अलग मान हैं क्योंकि उनकी कभी आवश्यकता नहीं होती है। इस साधारण डेटा सेट की कल्पना करें:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
3 | B | Y |
अगर आप लिखते हैं:
SELECT DISTINCT Column1
FROM T;
आपको मिलेगा
Column1
---------
A
B
अगर आप ORDER BY Column2
. जोड़ें , दो कॉलम2 में से आप A को X या Z के आधार पर ऑर्डर करने के लिए किसका उपयोग करेंगे? यह निर्धारित नहीं है कि कॉलम 2 के लिए मान कैसे चुनें।
समूह में नहीं कॉलम चुनने पर भी यही बात लागू होती है। चीजों को सरल बनाने के लिए पिछली तालिका की पहली दो पंक्तियों की कल्पना करें:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
MySQL में आप लिख सकते हैं
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1;
यह वास्तव में SQL मानक को तोड़ता है, लेकिन यह MySQL में काम करता है, हालांकि समस्या यह है कि यह गैर-नियतात्मक है, परिणाम:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
. से कम या ज्यादा सही नहीं है
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
तो आप जो कह रहे हैं वह मुझे Column1
. के प्रत्येक विशिष्ट मान के लिए एक पंक्ति देना है , जो दोनों परिणाम सेट संतुष्ट करते हैं, तो आप कैसे जानते हैं कि आपको कौन सा परिणाम मिलेगा? ठीक है आप नहीं, यह एक काफी लोकप्रिय गलत धारणा है जिसे आप जोड़ सकते हैं और ORDER BY
कर सकते हैं परिणामों को प्रभावित करने के लिए खंड, उदाहरण के लिए निम्नलिखित प्रश्न:
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1
ORDER BY ID DESC;
सुनिश्चित करेंगे कि आपको निम्नलिखित परिणाम प्राप्त हों:
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
ORDER BY ID DESC
के कारण , हालांकि यह सच नहीं है (जैसा कि यहां दिखाया गया है
)।
MySQL दस्तावेज़ राज्य:
इसलिए भले ही आपके पास इसके द्वारा एक आदेश है, तब तक लागू नहीं होता जब तक कि प्रति समूह एक पंक्ति का चयन नहीं किया जाता है, और यह एक पंक्ति गैर-निर्धारक है।
SQL-Standard उन चुनिंदा सूची में कॉलम की अनुमति देता है जो GROUP BY या एक समग्र फ़ंक्शन में शामिल नहीं हैं, हालाँकि ये कॉलम GROUP BY में एक कॉलम पर कार्यात्मक रूप से निर्भर होने चाहिए। SQL-2003-Standard (5WD-02-Foundation-2003-09 - पेज 346) से - http ://www.wiscorp.com/sql_2003_standard.zip
उदाहरण के लिए, नमूना तालिका में आईडी प्राथमिक कुंजी है, इसलिए हम जानते हैं कि यह तालिका में अद्वितीय है, इसलिए निम्न क्वेरी SQL मानक के अनुरूप है और MySQL में चलेगी और वर्तमान में कई DBMS में विफल हो जाएगी (Postgresql लिखने के समय) मानक को सही ढंग से लागू करने के बारे में मुझे पता है कि निकटतम डीबीएमएस है - यहां उदाहरण ):
SELECT ID, Column1, Column2
FROM T
GROUP BY ID;
चूंकि आईडी प्रत्येक पंक्ति के लिए अद्वितीय है, इसलिए Column1
. का केवल एक मान हो सकता है प्रत्येक आईडी के लिए, Column2
. का एक मान प्रत्येक पंक्ति के लिए क्या लौटाया जाए, इस बारे में कोई अस्पष्टता नहीं है।