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

पुराने PostgreSQL संस्करणों के लिए SELECT ... CROSS JOIN LATERAL ... स्टेटमेंट को फिर से कैसे लिखें?

PostgreSQL SELECT . में कॉलिंग सेट-रिटर्न फ़ंक्शन का समर्थन करता है खंड। यह अब कुछ हद तक बहिष्कृत है क्योंकि हमारे पास LATERAL . है और निश्चित रूप से हतोत्साहित किया जाता है क्योंकि इसमें अनियमित व्यवहार होता है, लेकिन यह उपयोगी रहता है।

आपके मामले में आप लिख सकते हैं:

SELECT 
  i.*,
  (partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;

हालांकि, इसके परिणामस्वरूप partition_into_months . पर एक कॉल हो सकती है प्रति कॉलम लौटा क्योंकि (fn).* मूल रूप से मैक्रो-विस्तारित है (fn).col1, (fn).col2, ... . इससे बचने के लिए, आप इसे एक सबक्वेरी में लपेट सकते हैं, उदा.

SELECT (x.i).*, (x.p).*
FROM
(
  SELECT 
    i,
    partition_into_months(i.start_date, i.stop_or_current_date) p
  FROM invoicable_interval i
) x(i,p);

ध्यान दें कि SELECT . में कई सेट रिटर्निंग फ़ंक्शंस की उपस्थिति में अजीब परिणाम सामने आएंगे सूची। यह एक क्रॉस-जॉइन नहीं है जैसा आप उम्मीद करेंगे। उदाहरण के लिए, तुलना करें:

SELECT generate_series(1,4), generate_series(1,4)

करने के लिए

SELECT generate_series(1,4), generate_series(1,3);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL पर एकाधिक सूत्र

  2. प्राथमिक कुंजी उल्लंघन त्रुटि के बाद लेनदेन जारी रखना

  3. क्लाउडफॉर्मेशन टेम्पलेट में पोस्टग्रेज आरडीएस बनाने में समस्या

  4. PostgreSQL में JS Date.now () को कैसे सेव करें?

  5. Django में SearchVector और SearchQuery के साथ असंगत का उपयोग करना