टिप्पणियों और उत्तरों के अलावा, जो आपको पहले ही दिए जा चुके हैं, मेरा मानना है कि आपने अपनी प्रक्रिया को व्यापक रूप से जटिल कर दिया है। आप चीजों को बहुत प्रक्रियात्मक तरीके से कर रहे हैं, न कि सेट में सोचने के बजाय जैसा आपको होना चाहिए। आपको तीन प्रश्नों में समेकित कॉलम भी मिल रहे हैं जो अनिवार्य रूप से समान हैं (उदाहरण के लिए समान तालिकाएं, शर्तों में शामिल हों और भविष्यवाणी करें) - आप एक ही क्वेरी में तीन परिणाम प्राप्त करने के लिए उन सभी को जोड़ सकते हैं।
ऐसा लगता है कि यदि उस क्लाइंट के लिए कोई पंक्ति पहले से मौजूद नहीं है, तो आप क्लाइंट-ऐतिहासिक खरीद तालिका में सम्मिलित करने का प्रयास कर रहे हैं, अन्यथा आप पंक्ति को अपडेट करते हैं। वह तुरंत मुझे "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;
हालांकि, मुझे आपके वर्तमान तर्क और/या डेटा मॉडल पर कुछ चिंताएं हैं।
ऐसा लगता है कि आप क्लाइंट-ऐतिहासिक खरीदारी में प्रति क्लाइंट अधिकतम एक पंक्ति में दिखाई देने की अपेक्षा कर रहे हैं। क्या होगा यदि किसी क्लाइंट के पास दो या अधिक भिन्न ऑर्डर हों? वर्तमान में आप किसी भी मौजूदा पंक्ति को अधिलेखित कर देंगे।
साथ ही, क्या आप वास्तव में इस तर्क को हर बार चलने पर सभी आदेशों पर लागू करना चाहते हैं?