अपडेट करें:
LATERAL
जॉइन इसकी अनुमति देते हैं और पोस्टग्रेज 9.3 के साथ पेश किए गए थे। विवरण:
कारण त्रुटि संदेश में है। FROM
. का एक तत्व सूची FROM
. के किसी अन्य तत्व को संदर्भित नहीं कर सकती है समान स्तर पर सूची यह समान स्तर पर किसी सहकर्मी के लिए दृश्यमान नहीं है। आप इसे सहसंबंधित सबक्वेरी के साथ हल कर सकते हैं :
SELECT *, (SELECT t FROM rp ORDER BY abs(rp.t - rq.t) LIMIT 1) AS ra
FROM rq
जाहिर है, आपको परवाह नहीं है कि कौन सी पंक्ति RP
. से है आप समान रूप से करीबी पंक्तियों के एक सेट से चुनते हैं, इसलिए मैं वही करता हूं।
हालांकि, SELECT
. में एक सबक्वेरी एक्सप्रेशन सूची केवल एक लौटा सकती है कॉलम। यदि आप तालिका RP
. से एक या सभी कॉलम से अधिक चाहते हैं , इस सबक्वेरी निर्माण की तरह कुछ का उपयोग करें:
मैं प्राथमिक कुंजी id
के अस्तित्व को मानता हूं दोनों टेबलों में।
SELECT id, t, (ra).*
FROM (
SELECT *, (SELECT rp FROM rp ORDER BY abs(rp.t - rq.t) LIMIT 1) AS ra
FROM rq
) x;
संबंधित उपश्रेणियाँ खराब प्रदर्शन के लिए बदनाम हैं . इस प्रकार की क्वेरी - स्पष्ट रूप से आप जो चाहते हैं उसकी गणना करते समय - चूसना विशेष रूप से, क्योंकि अभिव्यक्ति rp.t - rq.t
एक सूचकांक का उपयोग नहीं कर सकता। बड़ी तालिकाओं के साथ प्रदर्शन बहुत खराब हो जाएगा।
यह फिर से लिखी गई क्वेरी इंडेक्स पर RP.t
. का उपयोग करने में सक्षम होनी चाहिए , जो काफी प्रदर्शन करना चाहिए बड़ी तालिकाओं के साथ तेज़ ।
WITH x AS (
SELECT *
,(SELECT t
FROM rp
WHERE rp.t < rq.t
ORDER BY rp.t DESC
LIMIT 1) AS t_pre
,(SELECT t
FROM rp
WHERE rp.t >= rq.t
ORDER BY rp.t
LIMIT 1) AS t_post
FROM rq
)
SELECT id, t
,CASE WHEN (t_post - t) < (t - t_pre)
THEN t_post
ELSE COALESCE(t_pre, t_post) END AS ra
FROM x;
दोबारा, यदि आप पूरी पंक्ति चाहते हैं:
WITH x AS (
SELECT *
,(SELECT rp
FROM rp
WHERE rp.t < rq.t
ORDER BY rp.t DESC
LIMIT 1) AS t_pre
,(SELECT rp
FROM rp
WHERE rp.t >= rq.t
ORDER BY rp.t
LIMIT 1) AS t_post
FROM rq
), y AS (
SELECT id, t
,CASE WHEN ((t_post).t - t) < (t - (t_pre).t)
THEN t_post
ELSE COALESCE(t_pre, t_post) END AS ra
FROM x
)
SELECT id AS rq_id, t AS rq_t, (ra).*
FROM y
ORDER BY 2;
संयुक्त प्रकार वाले कोष्ठकों . के उपयोग पर ध्यान दें ! यहां कोई माता-पिता बेमानी नहीं है। इसके बारे में यहां मैनुअल में अधिक जानकारी और यहां ।
PostgreSQL 9.1 के साथ परीक्षण किया गया। sqlfiddle पर डेमो।