2010-07-02 25 views
5

मैं SQL सर्वर 2008 का उपयोग कर रहा हूं और मेरे पास 3 टेबल, x, y और z हैं। yx और z के बीच कई से अधिक संबंध बनाने के लिए मौजूद है।कई से कई रिश्तों में अधिकतम मूल्य

x  y  z 
--  --  -- 
id xid  id 
     zid sort 

उपरोक्त सभी फ़ील्ड int हैं।

मैं अच्छा प्रदर्शन करने वाले विधि किसी भी x के लिए उच्चतम sort साथ z पाने की (denormalising को छोड़कर) मिल जाए, और सभी तीन तालिकाओं से सभी क्षेत्रों लौटना चाहते।

नमूना डेटा:

x: id 
    -- 
     1 
     2 

y: xid zid 
    --- --- 
     1 1 
     1 2 
     1 3 
     2 2 

z: id sort 
    -- ---- 
    1 5 
    2 10 
    3 25 

परिणाम सेट होना चाहिए

xid zid 
--- --- 
    1 3 
    2 2 

ध्यान दें कि यदि एक से अधिक z ही उच्चतम sort मूल्य के साथ मौजूद है, तो मैं अभी भी केवल x प्रति एक पंक्ति चाहते हैं।

ध्यान दें कि मेरी वास्तविक दुनिया की स्थिति में, मेरे तीन सेट में अन्य फ़ील्ड हैं जो मुझे अपने परिणाम सेट में चाहिए।

+0

मुझे लगता है आप वास्तविक दुनिया स्थिति के समाधान के बाद कर रहे हैं? मेरा सुझाव है कि आप प्रत्येक तालिका के लिए कुछ अतिरिक्त फ़ील्ड के साथ अपना प्रश्न अपडेट करें, और परिभाषित करें कि आप अपना परिणाम क्या चाहते हैं-देखने के लिए सेट करें। – MPritchard

+0

बस इस प्रश्न को जोड़ने के लिए। क्या आपका डेटाबेस डिज़ाइन निश्चित है या अभी भी कार्यान्वित किया जा रहा है? मुझे यह अजीब लगता है कि आपका "सॉर्ट" जेड टेबल में है और वाई टेबल में नहीं है। मुझे आमतौर पर पता चलता है कि इस तरह के कई संबंधों में से कई के पास अक्सर "जे" टेबल पर "z" रुचि हो सकती है। अगर मैं गलत हूं, तो मुझे अनदेखा करें, संदर्भ के बिना जानना असंभव है। –

+0

यह अभी भी लागू किया जा रहा है और मैं जो कहता हूं उससे सहमत हूं, लेकिन जो बनाया जा रहा है उसके संदर्भ में, क्रमशः 'z' तालिका पर होना चाहिए और होना चाहिए। – enashnash

उत्तर

0

एक विधि एक उप क्वेरी के साथ है। हालांकि यह ज़ेड की आईडी प्राप्त करने के लिए केवल अच्छा है। यदि आपको एक्स और जेड टेबल दोनों से अधिक/सभी कॉलम चाहिए तो यह सबसे अच्छा समाधान नहीं है।

SELECT 
    x.id, 
    (
     SELECT TOP 1 
      z.zid 
     FROM 
      y 
     INNER JOIN 
      z 
     ON 
      z.id = y.zid 
     WHERE 
      y.xid = x.id 
     ORDER BY 
      z.sort DESC 
    ) 
FROM 
    x 

यह है कि आप इसे कैसे कर सकते हैं और सभी तालिकाओं से सभी डेटा वापस कर सकते हैं।

SELECT 
    * 
FROM 
    x 
INNER JOIN 
    y 
ON 
    y.xid = x.id 
AND 
    y.zid = 
(
    SELECT TOP 1 
     z2.zid 
    FROM 
     y y2 
    INNER JOIN 
     z z2 
    ON 
     z2.id = y2.zid 
    WHERE 
     y2.xid = x.id 
    ORDER BY 
     z2.sort DESC 
) 
INNER JOIN 
    z 
ON 
    z.id = y.zid 
+0

पर काम नहीं करता है – enashnash

+0

सभी डेटा –

+0

शामिल करने के लिए संपादित किया गया है मैंने अभी इसकी तुलना अरकनीड द्वारा प्रदान किए गए समाधान के मुकाबले की है और यह मेरे संदर्भ में 8% तेज है। – enashnash

0
select xid,max(zid) as zid from y 
group by xid 
+0

अधिकतम "सॉर्ट" पर ज़ेड पर नहीं है। इसलिए यह –

0
select xid, zid /* columns from x; and columns from y or z taken from q */ 
from (select y.xid, y.zid, /* columns from y or z */ 
      row_number() over(partition by y.xid order by z.sort desc) r 
     from y 
      join z on z.id = y.zid 
    ) q 
    join x on x.id = q.xid 
where r = 1 
+0

मुझे लगता है कि यह वही है जो मैं ढूंढ रहा हूं। मैं आंतरिक चयन में अतिरिक्त कॉलम जोड़ सकता हूं और फिर उन सभी तीन तालिकाओं में सभी कॉलम प्राप्त करने के लिए बाहरी में से एक का चयन कर सकता हूं। अब मुझे यह जानने की जरूरत है कि यह करने का यह सबसे अच्छा तरीका है या नहीं। – enashnash

संबंधित मुद्दे