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

त्रुटि:FROM में सबक्वेरी समान क्वेरी स्तर के अन्य संबंधों को संदर्भित नहीं कर सकती है

अपडेट करें:

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 पर डेमो।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रिटर्निंग त्रुटि का कारण बनता है:तालिका के लिए FROM-क्लॉज प्रविष्टि गुम है

  2. पोस्टग्रेज कनेक्शन पूलिंग - एकाधिक उपयोगकर्ता

  3. SQLAlchemy में Postgres/PostGIS View के साथ काम करें

  4. पोस्टग्रेज कॉलम उपनाम समस्या

  5. मैं क्वेरी परिणाम को अलग-अलग कॉलम में कैसे तोड़ सकता हूं?