एक सहसंबद्ध उपशम की तरह
एक LATERAL
जॉइन (पोस्टग्रैजेस 9.3 या बाद का) एक सहसंबद्ध सबक्वेरी की तरह अधिक है , न कि एक सादी उपश्रेणी। जैसे कि ओन्डोमर ने बताया , किसी कार्य में LATERAL
शामिल होने के अधिकार के लिए एक फ़ंक्शन या सबक्वेरी का मूल्यांकन उसके बाईं ओर की प्रत्येक पंक्ति के लिए एक बार किया जाना चाहिए - ठीक एक सहसंबंधित उप-वर्ग की तरह - जबकि एक सादे उप-तालिका (टेबल एक्सप्रेशन) का मूल्यांकन केवल एक बार किया जाता है। (क्वेरी प्लानर के पास हालांकि, प्रदर्शन के अनुकूलन के तरीके हैं।)
इस संबंधित उत्तर में दोनों पक्षों के लिए कोड उदाहरण हैं, एक ही समाधान हल करना:
एक से अधिक कॉलम वापस करने के लिए , एक LATERAL
जॉइन आमतौर पर सरल, क्लीनर और तेज होता है।
इसके अलावा, याद रखें कि एक सहसंबद्ध उपशम के बराबर हैLEFT JOIN LATERAL ... ON true
:
मैनुअल पर पढ़ें LATERAL
यह उन चीज़ों से अधिक आधिकारिक है, जिन्हें हम यहां जवाब देने जा रहे हैं:
चीजें एक सबक्वेरी नहीं कर सकती हैं
वहाँ रहे हैं चीजें हैं जो एक LATERAL
में शामिल होने के लिए कर सकते हैं, लेकिन एक (सहसंबद्ध) सबक्वेरी (आसानी से) नहीं कर सकता। एक संबद्ध उपकुंजी केवल एक मान लौटा सकती है, न कि कई कॉलम और न ही कई पंक्तियाँ - नंगे फ़ंक्शन कॉल के अपवाद के साथ (जो पंक्तियों को कई पंक्तियों को वापस करने पर गुणा करें)। लेकिन यहां तक कि निश्चित सेट even रिटर्निंग फ़ंक्शन केवल FROM
क्लॉज में अनुमति दी जाती है । जैसा unnest()
Postgres 9.4 या बाद में कई मानकों के साथ। नियम पुस्तिका:
यह केवल FROM
खंड में अनुमति है ;
तो यह काम करता है, लेकिन आसानी से एक उपश्रेणी के साथ प्रतिस्थापित नहीं किया जा सकता है:
CREATE TABLE tbl (a1 int[], a2 int[]);
SELECT * FROM tbl, unnest(a1, a2) u(elem1, elem2); -- implicit LATERAL
खंड ,
में अल्पविराम ( ) के लिए FROM
संक्षिप्त संकेतन है CROSS JOIN
।
LATERAL
स्वचालित रूप से तालिका कार्यों के लिए मान लिया गया है।
के विशेष मामले के बारे में अधिक UNNEST( array_expression [, ... ] )
:
SELECT
सूची में सेट-रिटर्निंग फ़ंक्शन
आप सीधे सूची unnest()
में सेट-रिटर्न फ़ंक्शन का उपयोग कर सकते SELECT
हैं। यह SELECT
9.6 पोस्ट करने के लिए एक ही सूची में एक से अधिक ऐसे समारोह के साथ आश्चर्यजनक व्यवहार का प्रदर्शन करता था । लेकिन अंत में इसे पोस्टग्रेज 10 के साथ पवित्रा किया गया है और अब एक वैध विकल्प है (भले ही मानक एसक्यूएल नहीं)। देख:
उपरोक्त उदाहरण पर निर्माण:
SELECT *, unnest(a1) AS elem1, unnest(a2) AS elem2
FROM tbl;
तुलना:
dgfield pg के लिए 9.6 यहाँ
pg 10 के लिए dbfiddle यहाँ
गलत सूचना को स्पष्ट करें
नियम पुस्तिका:
के लिए INNER
और OUTER
शामिल होने के प्रकार, एक में शामिल होने के शर्त अवश्य, अर्थात् वास्तव में से एक NATURAL
, ON
join_condition , या USING
( join_column [...])। अर्थ के लिए नीचे देखें।
के लिए CROSS JOIN
, इनमें से कोई भी क्लॉज़ दिखाई नहीं दे सकता है।
तो ये दोनों प्रश्न मान्य हैं (भले ही विशेष रूप से उपयोगी न हों):
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t ON TRUE;
SELECT *
FROM tbl t, LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
जबकि यह एक नहीं है:
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
क्यों ऐसा इसलिए है @ Andomar के कोड उदाहरण सही है ( CROSS JOIN
एक शर्त में शामिल होने की आवश्यकता नहीं है) और @ अट्टिला की है अवैध था।
apply
समान हैlateral
)