दूसरे कॉलम को वापस करते हुए, एक कॉलम पर DISTINCT का चयन करें?


12

मेरे पास एक क्वेरी है जो मुझे आवश्यक सभी जानकारी प्राप्त करने के लिए तीन लुकअप तालिकाओं का उपयोग करती है। मुझे DISTINCTएक कॉलम के लिए मान रखने की आवश्यकता है, हालांकि मुझे इसके साथ जुड़े बाकी डेटा की भी आवश्यकता है।

मेरा SQL कोड:

SELECT acss_lookup.ID AS acss_lookupID,
   acss_lookup.product_lookupID AS acssproduct_lookupID,
   acss_lookup.region_lookupID AS acssregion_lookupID,
   acss_lookup.document_lookupID AS acssdocument_lookupID,
   product.ID AS product_ID,
   product.parent_productID AS productparent_product_ID,
   product.label AS product_label,
   product.displayheading AS product_displayheading,
   product.displayorder AS product_displayorder,
   product.display AS product_display,
   product.ignorenewupdate AS product_ignorenewupdate,
   product.directlink AS product_directlink,
   product.directlinkURL AS product_directlinkURL,
   product.shortdescription AS product_shortdescription,
   product.logo AS product_logo,
   product.thumbnail AS product_thumbnail,
   product.content AS product_content,
   product.pdf AS product_pdf,
   product.language_lookupID AS product_language_lookupID,
   document.ID AS document_ID,
   document.shortdescription AS document_shortdescription,
   document.language_lookupID AS document_language_lookupID,
   document.document_note AS document_document_note,
   document.displayheading AS document_displayheading
FROM acss_lookup
     INNER JOIN product ON (acss_lookup.product_lookupID = product.ID)
     INNER JOIN document ON (acss_lookup.document_lookupID = document.ID)
ORDER BY product_displayheading ASC;

मैं इस क्वेरी से सभी उत्पाद प्राप्त करना चाहता हूं, लेकिन मैं केवल एक बार उन्हें प्राप्त करना चाहता हूं क्योंकि मैं एक खोज एप्लिकेशन के लिए ड्रॉप डाउन मेनू को पॉप्युलेट कर रहा हूं। मैं चाहता हूं कि उपयोगकर्ता उस तालिका में मौजूद उत्पादों से चयन करने में सक्षम हो (इसीलिए मुझे केवल एक बार उनकी आवश्यकता है)।

क्या यह बहुत जटिल है? क्या मुझे अधिक सरलीकृत दृष्टिकोण का उपयोग करना चाहिए?


लेकिन एक उत्पाद कई दस्तावेजों से संबंधित है। और आपकी क्वेरी उन सभी (किसी उत्पाद के लिए दस्तावेज़) को वापस कर देती है। किसे चुना जाना चाहिए?
ypercube y

जवाबों:


7

एक और दृष्टिकोण जिसका उल्लेख अभी तक नहीं किया गया है वह है विंडो फ़ंक्शंस का उपयोग करना, उदाहरण के लिए row_number:

   SELECT * FROM  
   (
   SELECT acss_lookup.ID AS acss_lookupID, 
   ROW_NUMBER() OVER 
   (PARTITION BY your_distinct_column ORDER BY any_column_you_think_is_appropriate)
   as num,
   acss_lookup.product_lookupID AS acssproduct_lookupID,
   acss_lookup.region_lookupID AS acssregion_lookupID,
   acss_lookup.document_lookupID AS acssdocument_lookupID,
   product.ID AS product_ID,
   product.parent_productID AS productparent_product_ID,
   product.label AS product_label,
   product.displayheading AS product_displayheading,
   product.displayorder AS product_displayorder,
   product.display AS product_display,
   product.ignorenewupdate AS product_ignorenewupdate,
   product.directlink AS product_directlink,
   product.directlinkURL AS product_directlinkURL,
   product.shortdescription AS product_shortdescription,
   product.logo AS product_logo,
   product.thumbnail AS product_thumbnail,
   product.content AS product_content,
   product.pdf AS product_pdf,
   product.language_lookupID AS product_language_lookupID,
   document.ID AS document_ID,
   document.shortdescription AS document_shortdescription,
   document.language_lookupID AS document_language_lookupID,
   document.document_note AS document_document_note,
   document.displayheading AS document_displayheading
   FROM acss_lookup
     INNER JOIN product ON (acss_lookup.product_lookupID = product.ID)
     INNER JOIN document ON (acss_lookup.document_lookupID = document.ID)
   )a
   WHERE a.num = 1
   ORDER BY product_displayheading ASC;

@ a1ex07- धन्यवाद! वह काम किया। हर बार जब मैंने नेट से कुछ उदाहरण को अनुकूलित करने की कोशिश की, तो यह मेरा जॉइन था जिसने मुझे भ्रमित कर दिया, लेकिन मुझे लगता है कि मैं इसे अभी प्राप्त करता हूं।
स्टेपहोमलैंड

यह बेहतर होगा कि यदि आप डेटा को क्वेरी और डुप्लिकेट करने के लिए केवल "फेंक" के लिए विंडो फ़ंक्शन से संख्या = 1 का चयन करें, तो डेटा को "अलग" नहीं बनाने के लिए, उपकुंजी के बाहर जॉइन करना बेहतर होगा।
एलन एस। हैनसेन

4

ऐसा करने के कुछ तरीके हैं। मेरे द्वारा उपयोग किए जाने वाले दो मुख्य टेबल सामान्य अभिव्यक्ति और उप-प्रश्न हैं। CTE के उपयोग से आपकी क्वेरी कुछ इस तरह दिखाई देगी:

WITH theResultSet AS
(
    SELECT DISTINCT(column) AS col1 FROM some.table
)
SELECT whatever
  FROM more.data AS a
  JOIN theResultSet as b ON a.col1 = b.col1
  /* additional joins, clauses etc...*/

या उपशम का उपयोग करना:

SELECT whatever
  FROM more.data AS a
  JOIN (SELECT DISTINCT(column) AS col1 FROM some.table) AS b ON a.col1 = b.col1
/* additional joins, clauses etc... */

मैं आम तौर पर यह देखने के लिए परीक्षण करता हूं कि कौन सा तेज है और उस एक के साथ जाना है।

मैं आशान्वित हूं कि इससे आपको सहायता मिलेगी।


मुझे लगा कि मैं आपके उत्तर को समझ गया हूं इसलिए मैंने इसे (पहले वाले) को आजमाया, लेकिन मुझे लगता है कि मेरे JOINS आपके समाधान के JOINS में समस्या पैदा कर रहे हैं।
स्टेपहोमलैंड

वह कॉलम जो अलग होना चाहिए? मैं आपके लिए एक अधिक व्यापक समाधान पोस्ट करूंगा।
Mr.Brownstone

product.displayheading
स्टेपहोमलैंड

1

(मुझे लगता है कि आप जो करने की कोशिश कर रहे हैं, वह किसी उत्पाद के लिए प्रत्येक परिणाम पंक्ति को "संक्षिप्त" करना है, इसलिए यह उत्तर उस धारणा पर चल रहा है।)

यह नहीं हो सकता। अन्य तालिकाओं से संबंधित 1 .. * डेटा प्राप्त करने के लिए, आपको अन्य कॉलमों में डुप्लिकेट मानों को वापस करना होगा।

आम तौर पर इसे संभालने का तरीका क्वेरी को चलाने के रूप में है, और आवेदन कोड में शामिल किए गए परिणाम को संसाधित करें। मैं आमतौर पर हैश कलेक्शन एप्रोच का उपयोग करता हूं जो कि एक कुंजी मूल्य के आधार पर एक संग्रह में प्रत्येक प्रकार की अलग-अलग संस्थाओं के साथ समाप्त होता है।

हालांकि यह दृष्टिकोण नेटवर्क ट्रैफ़िक के मामले में अधिक खर्च करता है, लेकिन आमतौर पर यह कुछ करना पसंद करता है जैसे कि कई प्रश्न चलाना और एक साथ परिणाम सिलाई करना जैसा कि आपको एप्लिकेशन कोड में आवश्यक है। यह कई कारकों पर निर्भर करता है, जिसमें कितनी बार क्वेरी / क्वेरी चलती है और कितना डेटा वापस किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.