2016-11-04 10 views
7

साथ शामिल हो रहा है जैसेवाम बाहरी केवल पहली पंक्ति

SELECT S.product_id, S.link, C.id AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
LEFT OUTER JOIN Categories C ON c.product_id = P.id 
WHERE P.active = 1 

मैं जब तक मेरे लिए ठीक काम करता है के रूप में प्रत्येक उत्पाद केवल एक श्रेणी के लिए असाइन किया गया है एक प्रश्न कुछ है। लेकिन अगर किसी उत्पाद को कई श्रेणियों को सौंपा गया है तो यह सभी संभावित संयोजनों को वापस कर देता है।

मैं केवल प्रथम एक को चुन सकते हैं और यदि एक उत्पाद किसी भी वर्ग की जरूरत नहीं है लिंक अभी भी, category_id = शून्य

+6

'पहले एक', किस मानदंड के अनुसार? – Lamak

+0

आप श्रेणी_आईडी पर MIN या MAX और GROUP BY जोड़ सकते हैं। यदि यह पर्याप्त नहीं है, तो श्रेणियों को एक सबक्वायरी में ले जाएं। – Stavr00

उत्तर

4

एक आसान तरीका है बाहरी उपयोग करने के लिए लागू होते हैं, तो के रूप में एक सहसंबद्ध है करने के लिए शामिल हो, और कहा कि एक शीर्ष 1 क्वेरी बनाते हैं। इस प्रकार आप प्रश्न में श्रेणी रिकॉर्ड के सभी कॉलम तक पहुंचने में सक्षम हैं। मैं यहां एक उदाहरण नाम के रूप में एक श्रेणी का नाम जोड़ रहा हूं:

select s.product_id, s.link, c.id as category_id, c.name as category_name 
from products p 
inner join seo s on s.product_id = p.id 
outer apply 
(
    select top 1 * 
    from categories cat 
    where cat.product_id = p.id 
    order by cat.id 
) c 
where p.active = 1 
and p.product_type = 1; 
+0

बाहरी उपयोग का उपयोग करके श्रेणी तालिका पर किसी भी कॉलम द्वारा ऑर्डर करना भी संभव है, जो शायद उसे चाहिए। – Magnus

3

के साथ वापस आ जाना चाहिए तुम एक Aggregate समारोह के साथ-साथ यह पूरा करने के लिए एक GROUP BY उपयोग कर सकते हैं सबसे संभावना MIN या MAX

आपके परिणाम में आप कौन सी श्रेणी आईडी पसंद करते हैं इसके आधार पर आप न्यूनतम का चयन कर सकते हैं।

SELECT S.product_id, S.link, MIN(C.id) AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
LEFT OUTER JOIN Categories C ON c.product_id = P.id 
WHERE P.active = 1 
GROUP BY S.product_id, S.link 

या अधिकतम।

SELECT S.product_id, S.link, MAX(C.id) AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
LEFT OUTER JOIN Categories C ON c.product_id = P.id 
WHERE P.active = 1 
GROUP BY S.product_id, S.link 
1

वैकल्पिक समाधान सबक्वेरी का उपयोग कर:

SELECT S.product_id, S.link, 
(
SELECT C.id FROM Categories C WHERE C.product_id = P.id AND 
ROW_NUMBER() OVER(ORDER BY /* your sort option goes here*/) = 1 
) AS category_id 
FROM Products P 
INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 
WHERE P.active = 1 
संबंधित मुद्दे