PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgresql से MySQL में प्रश्नों पर चयन DISTINCT परिवर्तित करना

Postgresql क्वेरी को कनवर्ट करने के लिए सटीक समकक्ष नहीं है जो SELECT DISTINCT ON को MySQL में उपयोग करता है।

Postgresql SELECT DISTINCT ON

Postgresql में, निम्न क्वेरी उन सभी पंक्तियों को समाप्त कर देगी जहां भाव (col1, col2, col3) मेल खाता है, और यह मिलान वाली पंक्तियों के प्रत्येक सेट के लिए केवल "पहली col4, col5 पंक्ति" रखेगा:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename

तो अगर आपकी टेबल इस तरह है:

col1 | col2 | col3 | col4 | col5
--------------------------------
1    | 2    | 3    | 777  | 888
1    | 2    | 3    | 888  | 999
3    | 3    | 3    | 555  | 555

हमारी क्वेरी (1,2,3) के लिए केवल एक पंक्ति और (3,3,3) के लिए एक पंक्ति रखेगी। परिणामी पंक्तियाँ तब होंगी:

col4 | col5
-----------
777  | 888
555  | 555

कृपया ध्यान दें कि प्रत्येक सेट की "पहली पंक्ति" अप्रत्याशित है, हमारी पहली पंक्ति (888, 999) भी हो सकती है, जब तक कि हम एक ORDER BY निर्दिष्ट नहीं करते:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4

(अभिव्यक्तियों पर DISTINCT सबसे बाईं ओर के ORDER BY भावों से मेल खाना चाहिए, लेकिन ORDER BY में अतिरिक्त भाव हो सकते हैं)।

GROUP BY के लिए MySQL एक्सटेंशन

MySQL GROUP BY के उपयोग को बढ़ाता है ताकि हम गैर-समेकित कॉलम का चयन कर सकें जिसका नाम GROUP BY क्लॉज में नहीं है। जब भी हम गैर-समेकित कॉलम चुनते हैं तो सर्वर उस कॉलम से प्रत्येक समूह से कोई भी मान चुनने के लिए स्वतंत्र होता है, इसलिए परिणामी मान अनिश्चित हो जाएंगे।

तो यह Postgresql क्वेरी:

SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename

इस MySQL क्वेरी के समतुल्य माना जा सकता है:

SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3

Postgresql और MySQL दोनों प्रत्येक (col1, col2, col3) के लिए "पहली पंक्ति" लौटाएंगे, और दोनों ही मामलों में लौटाई गई पंक्ति अप्रत्याशित है क्योंकि हमने खंड द्वारा निर्दिष्ट और आदेश नहीं दिया है।

बहुत से लोग इस Postgresql क्वेरी को ORDER BY:

के साथ बदलने के लिए बहुत ललचाएंगे।
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4

इसके साथ:

SELECT col4, col5
FROM (
  SELECT col1, col2, col3, col4, col5
  FROM tablename
  ORDER BY col1, col2, col3, col4
) s
GROUP BY col1, col2, col3

यहाँ विचार एक सबक्वेरी के लिए ORDER BY लागू करना है ताकि जब MySQL समूह col1, col2, col3 द्वारा समूहित हो तो यह col4 और col5 के लिए पहला सामना करने वाला मान रखेगा। विचार अच्छा है, लेकिन गलत है! MySQL col4 और col5 के लिए कोई भी मान चुनने के लिए स्वतंत्र है, और हम नहीं जानते कि कौन से पहले मान सामने आए हैं, यह अनुकूलक पर निर्भर करता है। तो मैं इसे इसमें ठीक कर दूंगा:

SELECT t1.col4, t1.col5
FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4
                              FROM tablename
                              GROUP BY col1, col2, col3) s
     ON t1.col1=s.col1
        AND t1.col2=s.col2
        AND t1.col3=s.col3
        AND t1.col4=s.m_col4
GROUP BY
  t1.col1, t1.col2, t1.col3, t1.col4

लेकिन यह और अधिक जटिल होने लगा है।

निष्कर्ष

एक सामान्य नियम के रूप में, Postgresql क्वेरी को MySQL क्वेरी में बदलने का कोई सटीक तरीका नहीं है, लेकिन बहुत सारे वर्कअराउंड हैं, परिणामी क्वेरी मूल के समान सरल हो सकती है या यह बहुत जटिल हो सकती है, लेकिन यह इस पर निर्भर करता है क्वेरी ही।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ट्रिगर फ़ंक्शन में गतिशील तालिका नाम के साथ INSERT

  2. ENUM डेटा प्रकार को पोस्टग्रेज करता है या CONSTRINT की जांच करता है?

  3. अपाचे स्पार्क के साथ प्राथमिक कुंजी

  4. मैं यह कैसे सुनिश्चित कर सकता हूं कि एक भौतिक दृश्य हमेशा अप टू डेट हो?

  5. हिस्टोग्राम डेटा से प्रतिशतक