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

बिना किसी पैरामीटर के हल करने की प्रक्रिया

टिप्पणियों और उत्तरों के अलावा, जो आपको पहले ही दिए जा चुके हैं, मेरा मानना ​​है कि आपने अपनी प्रक्रिया को व्यापक रूप से जटिल कर दिया है। आप चीजों को बहुत प्रक्रियात्मक तरीके से कर रहे हैं, न कि सेट में सोचने के बजाय जैसा आपको होना चाहिए। आपको तीन प्रश्नों में समेकित कॉलम भी मिल रहे हैं जो अनिवार्य रूप से समान हैं (उदाहरण के लिए समान तालिकाएं, शर्तों में शामिल हों और भविष्यवाणी करें) - आप एक ही क्वेरी में तीन परिणाम प्राप्त करने के लिए उन सभी को जोड़ सकते हैं।

ऐसा लगता है कि यदि उस क्लाइंट के लिए कोई पंक्ति पहले से मौजूद नहीं है, तो आप क्लाइंट-ऐतिहासिक खरीद तालिका में सम्मिलित करने का प्रयास कर रहे हैं, अन्यथा आप पंक्ति को अपडेट करते हैं। वह तुरंत मुझे "MERGE स्टेटमेंट" चिल्लाता है।

इन सभी को मिलाकर, मुझे लगता है कि आपकी वर्तमान प्रक्रिया में केवल एक मर्ज स्टेटमेंट होना चाहिए:

MERGE INTO clienthistoricalpurchases tgt
  USING (SELECT clients.client_id,
                COUNT(DISTINCT od.productid) distinct_products,
                COUNT(od.productid) total_products,
                SUM((od.unitprice * od.quantity) - od.discount) proposed_new_balance
         FROM   orderdetails od
         INNER  JOIN orders
         ON     orderdetails.orderid = orders.orderid
         INNER  JOIN clients
         ON     orders.clientid = clients.clientid
         GROUP BY clients.client_id) src
  ON (tgt.clientid = src.client_id)
WHEN NOT MATCHED THEN
  INSERT (tgt.clientid,
          tgt.distinctproducts,
          tgt.totalproducts,
          tgt.totalcost) 
  VALUES (src.clientid,
          src.distinct_products,
          src.total_products,
          src.proposed_new_balance)
WHEN MATCHED THEN
  UPDATE SET tgt.distinctproducts = src.distinct_products,
             tgt.totalproducts = src.total_products,
             tgt.totalcost = src.proposed_new_balance;

हालांकि, मुझे आपके वर्तमान तर्क और/या डेटा मॉडल पर कुछ चिंताएं हैं।

ऐसा लगता है कि आप क्लाइंट-ऐतिहासिक खरीदारी में प्रति क्लाइंट अधिकतम एक पंक्ति में दिखाई देने की अपेक्षा कर रहे हैं। क्या होगा यदि किसी क्लाइंट के पास दो या अधिक भिन्न ऑर्डर हों? वर्तमान में आप किसी भी मौजूदा पंक्ति को अधिलेखित कर देंगे।

साथ ही, क्या आप वास्तव में इस तर्क को हर बार चलने पर सभी आदेशों पर लागू करना चाहते हैं?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं ऑरैकल के साथ काम करने वाले grails में फ़ाइल अपलोड कैसे बना सकता हूं?

  2. ORA-29471 को dbms_sql.open_cursor पर कैसे हल करें?

  3. सत्र बदलें हाइबरनेट के माध्यम से क्वेरी को धीमा कर देता है

  4. Oracle:यदि तालिका मौजूद है

  5. JDBC Oracle पतला क्लाइंट दूसरे DB में विफल होने के लिए