एक तरीका इनलाइन व्यू का उपयोग करना है, जैसे आपके पास पहले से मौजूद क्वेरी। लेकिन DISTINCT का उपयोग करने के बजाय, आप डुप्लिकेट को समाप्त करने के लिए GROUP BY का उपयोग करेंगे। आपकी आवश्यकताओं को पूरा करने के लिए सबसे सरल इनलाइन दृश्य होगा:
( SELECT n.item_number, n.name, n.type_code
FROM itpitnam n
GROUP BY n.item_number
) itpitnam
हालांकि यह निर्धारित नहीं है कि itpitnam से कौन सी पंक्ति नाम और type_code के मान से पुनर्प्राप्त की जाती है। एक अधिक विस्तृत इनलाइन दृश्य इसे और अधिक विशिष्ट बना सकता है।
इस प्रकार की समस्या के लिए एक अन्य सामान्य दृष्टिकोण चयन सूची में एक सहसंबद्ध उपश्रेणी का उपयोग करना है। पंक्तियों के एक छोटे से सेट को वापस करने के लिए, यह यथोचित रूप से अच्छा प्रदर्शन कर सकता है। लेकिन बड़े सेट वापस करने के लिए, अधिक कुशल तरीके हैं।
SELECT i.identifier
, i.name
, i.subtitle
, i.description
, i.itemimg
, i.mainprice
, i.upc
, i.isbn
, i.weight
, i.pages
, i.publisher
, i.medium_abbr
, i.medium_desc
, i.series_abbr
, i.series_desc
, i.voicing_desc
, i.pianolevel_desc
, i.bandgrade_desc
, i.category_code
, r.overall_ranking
, ( SELECT n1.name
FROM itpitnam n1
WHERE n1.item_number = r.item_number
ORDER BY n1.type_code, n1.name
LIMIT 1
) AS artist
, ( SELECT n2.type_code
FROM itpitnam n2
WHERE n2.item_number = r.item_number
ORDER BY n2.type_code, n2.name
LIMIT 1
) AS type_code
FROM itpitems i
JOIN itprank r
ON r.item_number = i.identifier
WHERE mainprice > 1
LIMIT 3
वह क्वेरी निर्दिष्ट परिणामसेट को एक महत्वपूर्ण अंतर के साथ वापस कर देगी। मूल क्वेरी itpitnam
. में एक INNER JOIN दिखाती है मेज़। इसका मतलब है कि एक पंक्ति केवल तभी लौटाई जाएगी जब itpitnam
में एक मेल खाने वाली पंक्ति हो मेज़। हालाँकि, उपरोक्त क्वेरी एक OUTER JOIN का अनुकरण करती है, जब itpitnam
में कोई मिलान पंक्ति नहीं मिलती है, तो क्वेरी एक पंक्ति लौटा देगी। ।
अपडेट करें
उन सहसंबद्ध उपश्रेणियों के सर्वोत्तम प्रदर्शन के लिए, आप चाहते हैं कि एक उपयुक्त अनुक्रमणिका उपलब्ध हो,
... ON itpitnam (item_number, type_code, name)
वह सूचकांक सबसे उपयुक्त है क्योंकि यह एक "कवरिंग इंडेक्स" है, क्वेरी को अंतर्निहित तालिका में डेटा पृष्ठों को संदर्भित किए बिना पूरी तरह से इंडेक्स से संतुष्ट किया जा सकता है, और प्रमुख कॉलम पर समानता विधेय है, और अगले दो कॉलम पर एक ORDER BY है, ताकि "सॉर्ट" ऑपरेशन से बचा जा सके।
--
यदि आपके पास गारंटी है कि या तो type_code
या name
itpitnam तालिका में कॉलम NULL नहीं है, आप उन पंक्तियों को समाप्त करने के लिए एक विधेय जोड़ सकते हैं जो एक मिलान पंक्ति "अनुपलब्ध" हैं, उदा।
HAVING artist IS NOT NULL
(जोड़ने से प्रदर्शन पर असर पड़ने की संभावना है।) उस तरह की गारंटी के अभाव में, आपको एक INNER JOIN या एक विधेय जोड़ना होगा जो एक INNER JOIN व्यवहार प्राप्त करने के लिए एक मिलान पंक्ति के अस्तित्व के लिए परीक्षण करता है।