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

सेलेक्ट क्लॉज में एकाधिक सेट-रिटर्निंग फ़ंक्शंस के लिए अपेक्षित व्यवहार क्या है?

10 या नए को पोस्ट करें

छोटे सेट (सेटों) के लिए शून्य मान जोड़ता है। डेमो के साथ generate_series() :

SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
row2 | row3 | row4
-----+------+-----
   1 |   11 |   21
   2 |   12 |   22
null |   13 |   23
null | null |   24

यहां dbfiddle

पोस्टग्रेज के लिए मैनुअल 10 :

<ब्लॉकक्वॉट>

यदि क्वेरी की चयन सूची में एक से अधिक सेट-रिटर्निंग फ़ंक्शन हैं, तो व्यवहार वैसा ही है जैसा आपको फ़ंक्शन को एक LATERAL ROWS FROM( ... ) में डालने से मिलता है। FROM -क्लॉज आइटम। अंतर्निहित क्वेरी से फ़ोरैच पंक्ति, प्रत्येक फ़ंक्शन से पहले परिणाम का उपयोग करके एक आउटपुट पंक्ति होती है, फिर दूसरे परिणाम का उपयोग करके एक आउटपुट पंक्ति, और इसी तरह। यदि कुछ सेट-रिटर्निंग फ़ंक्शन दूसरों की तुलना में कम आउटपुट उत्पन्न करते हैं, तो लापता डेटा के लिए शून्य मानों को प्रतिस्थापित किया जाता है, ताकि एक अंतर्निहित पंक्ति के लिए उत्सर्जित पंक्तियों की कुल संख्या सेट-रिटर्निंग फ़ंक्शन के समान हो जो सबसे अधिक आउटपुट उत्पन्न करती है। इस प्रकार सेट-रिटर्निंग फ़ंक्शन "लॉकस्टेप में" चलते हैं जब तक कि वे सभी समाप्त नहीं हो जाते हैं, और फिर निष्पादन अगली अंतर्निहित पंक्ति के साथ जारी रहता है।

यह परंपरागत रूप से अजीब व्यवहार को समाप्त करता है।

9.6 या पुराने पोस्ट को पोस्ट करें

परिणाम पंक्तियों की संख्या (कुछ आश्चर्यजनक रूप से!) सबसे कम सामान्य गुणज . है सभी सेटों में से SELECT सूची। (केवल CROSS JOIN की तरह काम करता है यदि सभी सेट-साइज के लिए कोई सामान्य भाजक नहीं है!) डेमो:

SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
row2 | row3 | row4
-----+------+-----
   1 |   11 |   21
   2 |   12 |   22
   1 |   13 |   23
   2 |   11 |   24
   1 |   12 |   21
   2 |   13 |   22
   1 |   11 |   23
   2 |   12 |   24
   1 |   13 |   21
   2 |   11 |   22
   1 |   12 |   23
   2 |   13 |   24

यहां dbfiddle

Postgres के लिए मैनुअल में प्रलेखित 9.6 अध्याय SQL फ़ंक्शन रिटर्निंग सेट , इससे बचने की सिफारिश के साथ:

<ब्लॉकक्वॉट>

नोट:FROM के बजाय, चयन सूची में सेट-रिटर्निंग फ़ंक्शंस का उपयोग करने में मुख्य समस्या खंड, यह है कि एक ही चयन सूची में एक से अधिक सेट-रिटर्निंग फ़ंक्शन डालने से व्यवहार नहीं होता है। (यदि आप ऐसा करते हैं तो आपको वास्तव में क्या मिलता है, प्रत्येक सेट-रिटर्निंग फ़ंक्शन द्वारा उत्पादित पंक्तियों की संख्या के कम से कम सामान्य गुणक के बराबर कई आउटपुट पंक्तियाँ होती हैं। ) LATERAL कई सेट-रिटर्निंग फ़ंक्शंस को कॉल करते समय सिंटैक्स बिना आश्चर्यजनक परिणाम उत्पन्न करता है, और आमतौर पर इसके बजाय उपयोग किया जाना चाहिए।

बोल्ड जोर मेरा।

एक एकल सेट-रिटर्निंग फ़ंक्शन ठीक है (लेकिन अभी भी FROM . में क्लीनर है list), लेकिन एक ही SELECT . में एकाधिक सूची अब हतोत्साहित है। हमारे पास LATERAL . होने से पहले यह एक उपयोगी सुविधा थी जुड़ता है। अब यह केवल ऐतिहासिक गिट्टी है।

संबंधित:

  • PostgreSQL में समानांतर अननेस्ट () और सॉर्ट क्रम
  • एकाधिक सरणियों को समानांतर में अननेस्ट करें
  • लेटरल जॉइन और PostgreSQL में सबक्वेरी में क्या अंतर है?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. uWSGI, फ्लास्क, sqlalchemy, और postgres:SSL त्रुटि:डिक्रिप्शन विफल या खराब रिकॉर्ड मैक

  2. स्प्रिंग डॉकर कंटेनर पोस्टग्रेज डॉकर कंटेनर तक नहीं पहुंच सकता है

  3. कैसे घड़ी_टाइमस्टैम्प () PostgreSQL में काम करता है

  4. मैं कॉलम को दो टेबल से एक आउटपुट में कैसे मर्ज कर सकता हूं?

  5. अद्यतन करने योग्य दृश्यों के लिए CHECK क्लॉज