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

जॉइन के अंदर DISTINCT का उपयोग करना परेशानी पैदा कर रहा है

एक तरीका इनलाइन व्यू का उपयोग करना है, जैसे आपके पास पहले से मौजूद क्वेरी। लेकिन 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 व्यवहार प्राप्त करने के लिए एक मिलान पंक्ति के अस्तित्व के लिए परीक्षण करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. वेब सर्वर में सीधे PHP द्वारा सहेजे बिना, सर्वर साइड पर किसी फ़ाइल में बेस 64 स्ट्रिंग को कैसे निर्यात करें?

  2. संपूर्ण सबनेट के लिए MySQL को दूरस्थ पहुँच कैसे प्रदान करें?

  3. SQLSTATE [HY000] [2002] एक कनेक्शन प्रयास विफल रहा.. - स्थानीय से दूरस्थ सर्वर से कनेक्ट करने का प्रयास करते समय

  4. MySQL आयात का अनुकूलन (एक वर्बोज़ एसक्यूएल डंप को एक त्वरित एक में कनवर्ट करना / विस्तारित-आवेषण का उपयोग करें)

  5. अगर स्टेटमेंट के साथ एसक्यूएल क्वेरी