यह एक विचित्र बात है कि SELECT
में बुलाए जाने पर कितने सेट-रिटर्निंग फ़ंक्शन निष्पादित किए जाते हैं -सूची। आप उम्मीद करते हैं कि परिणाम दोनों का क्रॉस उत्पाद होगा, लेकिन ऐसा नहीं है कि यह कैसे काम करता है। यह वास्तव में दोनों की पंक्तियों की संख्या का सबसे कम सामान्य गुणक है।
देखें:
- ये आकार के आधार पर अलग-अलग क्यों जुड़ते हैं?
- एक चयन को फिर से कैसे लिखें ... पुराने PostgreSQL संस्करणों के लिए क्रॉस जॉइन लेटरल ... स्टेटमेंट?
तुलना करें:
test=> SELECT generate_series(1,3) aval, generate_series(1,4) bval;
aval | bval
------+------
1 | 1
2 | 2
3 | 3
1 | 4
2 | 1
3 | 2
1 | 3
2 | 4
3 | 1
1 | 2
2 | 3
3 | 4
(12 rows)
test=> SELECT generate_series(1,3) aval, generate_series(1,3) bval;
aval | bval
------+------
1 | 1
2 | 2
3 | 3
(3 rows)
इस कारण से, PostgreSQL 9.2 और इसके बाद के संस्करण पर आपको LATERAL
. का उपयोग करना चाहिए वे क्वेरी जहां आप FROM
. में सेट-रिटर्निंग फ़ंक्शन का आह्वान करते हैं खंड:
test=> SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,3) bval;
aval | bval
------+------
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
2 | 3
3 | 1
3 | 2
3 | 3
(9 rows)
test=> SELECT aval, bval FROM generate_series(1,3) aval CROSS JOIN LATERAL generate_series(1,4) bval;
aval | bval
------+------
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
2 | 2
2 | 3
2 | 4
3 | 1
3 | 2
3 | 3
3 | 4
(12 rows)
पुराने संस्करणों पर आप एक सेलेक्ट टर्म में एक से अधिक SRF होने से बचने के लिए सबक्वेरी-इन-FROM का उपयोग कर सकते हैं:
test=> SELECT generate_series(1,3) aval, bval FROM (SELECT generate_series(1,4)) AS x(bval);
aval | bval
------+------
1 | 1
2 | 1
3 | 1
1 | 2
2 | 2
3 | 2
1 | 3
2 | 3
3 | 3
1 | 4
2 | 4
3 | 4
(12 rows)