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

ORDER BY और ROWNUM . के साथ डबल-नेस्टेड क्वेरी में अमान्य पहचानकर्ता

आप जिस स्केलर सबक्वेरी का उपयोग कर रहे हैं, उसमें आप केवल "मुख्य" क्वेरी "एक नेस्टेड स्तर नीचे" से तालिकाओं का संदर्भ दे सकते हैं, और नीचे नहीं, जैसा कि आपने देखा है। (मेरा मानना ​​है कि यह प्रतिबंध संस्करण 12 में हटा लिया गया है, इसलिए हो सकता है कि आप अपने डेटाबेस को अपग्रेड कर सकें?;-)

स्केलर सबक्वायरी में आप अपने ऑर्डरिंग के अनुसार पहली पंक्ति के INSERTDATE कॉलम का मान प्राप्त करने का प्रयास कर रहे हैं। इसे बिना नेस्टिंग के भी लिखा जा सकता है:

SELECT
O.INSERTDATE OrderCreateDate,

-- Determine delivery date
(SELECT MAX(DD.INSERTDATE) KEEP (
          DENSE_RANK FIRST ORDER BY
          DD.CLOSED ASC, ABS(TRUNC(CURRENT_DATE-TO_DATE(TO_CHAR(DD.INSERTDATE, 'DDMMYYYY'), 'DDMMYYYY'))) ASC
        )
   FROM MY_DELIVERYDATE_TABLE DD
   JOIN MY_ORDERPOS_TABLE OP2 ON DD.FK_ORDERPOS=OP2.ID
   LEFT OUTER JOIN MY_ORDER_TABLE O2 ON OP2.FK_ORDER=O2.ID
   WHERE OP2.FK_ORDER=O.ID AND -- This will no longer give "Invalid identifier O.ID"
         DD.DELFLAG IS NULL AND OP2.DELFLAG IS NULL
) DeliveryDate

FROM MY_ORDER_TABLE O
WHERE O.ID = 620; -- ID goes here!

KEEP (DENSE_RANK FIRST MAX फ़ंक्शन को बताता है, कि उसे MAX केवल की गणना करनी चाहिए उन पंक्तियों में से जो प्रथम rank को रैंक करती हैं ORDER BY क्लॉज में। इसलिए यदि आपका ORDER BY "अद्वितीय" है, तो MAX केवल एक . पर लागू होगा पंक्ति। यदि आपका ORDER BY "अद्वितीय" नहीं है और इसमें डुप्लीकेट हो सकते हैं, तो आप सोच सकते हैं कि क्या आप MAX या MIN चाहते हैं (या इसे विशिष्ट बनाने के लिए ORDER BY में कुछ जोड़ें।)

(यदि आप Oracle संस्करण 12 पर थे, तो KEEP का एक विकल्प (DENSE_RANK ट्रिक यह होगा कि आप SELECT स्टेटमेंट के पहले 1 ROW ONLY क्लॉज का उपयोग करें।)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle पदानुक्रमित क्वेरी

  2. PL/SQL:ORA-00904:अमान्य पहचानकर्ता &PL/SQL:कथन पर ध्यान नहीं दिया गया&PLS-00364:लूप इंडेक्स वैरिएबल का उपयोग अमान्य है

  3. प्रति समूह एक कॉलम के अधिकतम मान के साथ वापसी पंक्ति

  4. JDBC स्वचालित क्वेरी बहुत धीमी हो गई

  5. sys_refcursor से किसी अन्य प्रक्रिया से प्राप्त करें और थोक एकत्र करें और दूसरी तालिका में डालें