यहां सिंटैक्स त्रुटि यह है कि आपको on
. की आवश्यकता है आपके left join
. के लिए खंड . लेकिन अंतर्निहित वैचारिक समस्या अलग है:आप join
आश्रित सबक्वायरी . के साथ ।
आप अपनी क्वेरी को इस तरह ठीक कर सकते हैं:
select items.*
from items
LEFT OUTER JOIN (
select item_id, sum(purchase_details.quantity) as total
from purchase_details
GROUP BY purchase_details.item_id
) ABC on ABC.item_id = items.id;
इससे आपका आंतरिक where
ले जाया गया -कंडीशन (जो items.id
. पर निर्भर करेगा) , जिसकी अनुमति नहीं है, क्योंकि यह दायरे से बाहर है) on
. पर -खंड। इस प्रकार item_id
आंतरिक select
. में भी जोड़ा जाता है (जैसा कि बाहर इसकी जरूरत है)।
इसे लिखने का एक अलग तरीका होगा
select items.*,
(select sum(purchase_details.quantity)
from purchase_details
where purchase_details.item_id=items.id) as total
from items;
यहां आपके पास एक आश्रित उपश्रेणी है :भीतरी where
-क्लॉज बाहरी items.id
. पर निर्भर करता है . आपको group by
. की आवश्यकता नहीं है अब, where
. के रूप में -कंडीशन पहले से ही उस आइटम के लिए केवल पंक्तियों का उपयोग करता है। (और आप इस संदर्भ में वैसे भी केवल एक ही पंक्ति में लौट सकते हैं।)
दोनों प्रश्न समान हैं, और (यदि अनुकूलक उस निष्पादन योजना को पाता है) आंतरिक रूप से वास्तव में उसी तरह से निष्पादित किया जा सकता है (जब तक आप उचित अनुक्रमणिका प्रदान करते हैं, तब तक आपको इसके बारे में ज्यादा परवाह करने की आवश्यकता नहीं है)।
तो आपके मामले में आप दोनों का उपयोग कर सकते हैं (और शायद जांचें कि कौन सा तेज़ है); यदि आप उस आइटम के लिए अतिरिक्त जानकारी प्राप्त करना चाहते हैं, तो आपको left join
पसंद करना चाहिए -वर्जन हालांकि, उदा। उपयोग करें
...
LEFT OUTER JOIN (
select item_id,
sum(purchase_details.quantity) as total,
count(purchase_details.item_id) as cnt,
max(purchase_details.quantity) as max_quantity_per_order,
max(purchase_details.date) as latest_order,
...
from purchase_details
GROUP BY purchase_details.item_id
) ABC on ABC.item_id = items.id;