2012-04-19 18 views
6

तो मुझे लगता है कि मैंने इसका समाधान देखा है, हालांकि वे सभी जटिल प्रश्न हैं। मैं संदर्भ के लिए ओरेकल 11 जी में हूँ।मैं इस बाएं जॉइन द्वारा लौटाई गई पंक्तियों की संख्या को कैसे सीमित कर सकता हूं?

मेरे पास जो कुछ है वह बहुत आसान है जो महान काम करता है, हालांकि मुझे कई की आवश्यकता नहीं है। मैं सिर्फ बाएं टेबल (एक) को किसी भी 1 पंक्ति में शामिल होना चाहता हूं जो शामिल मानदंडों को पूरा करता है ... कई पंक्तियां नहीं।

मैं यह करने के क्योंकि क्वेरी एक रोलअप जो इतनी गणना में क्या है की जरूरत है अगर मैं मैं 5 पंक्तियाँ मिल शामिल होने के सामान्य बाईं करना जहां मैं केवल हो रही किया जाना चाहिए 1.

तो उदाहरण डेटा इस प्रकार है:

TABLE 1: 
------------- 
TICKET_ID  ASSIGNMENT 
5    team1 
6    team2 

TABLE 2: 
------------- 
MANAGER_NAME ASSIGNMENT_GROUP USER 
joe   team1    sally 
joe   team1    stephen 
joe   team1    louis 
harry   team2    ted 
harry   team2    thelma 

मुझे क्या करना है ISSIGNMENT = ASSIGNMENT_GROUP पर इन दो तालिकाओं में शामिल होना है, लेकिन केवल 1 पंक्ति लौटा दी गई है।

जब मैं एक बाईं करना मैं तीन पंक्तियों लौटे beaucse कि hte की प्रकृति में शामिल होने

+3

यह टैग की गईं MySQL क्यों है? –

+2

हालांकि कई उत्तर पोस्ट किए गए हैं, लेकिन यह जानना असंभव है कि आपको क्या चाहिए यदि आप यह नहीं समझाते कि आप केवल 1 पंक्ति क्यों चाहते हैं। क्या आप वास्तव में एक असाइनमेंट_ग्रुप प्रति यादृच्छिक उपयोगकर्ता चाहते हैं? किस लिए? – winkbrace

उत्तर

7

ओरेकल पंक्ति संख्या (द्वारा विभाजन) जहां पंक्ति के बराबर होती है 1.

SELECT * FROM table1 
LEFT JOIN 
(SELECT * 
FROM (SELECT *, 
      ROW_NUMBER() 
      OVER(PARTITION BY assignmentgroup ORDER BY assignmentgroup) AS Seq 
    FROM table2) a 
WHERE Seq = 1) v 
ON assignmet = v.assignmentgroup 
+0

क्या आप अबाउट क्वेरी के आधार पर एक उदाहरण SQL कथन पोस्ट कर सकते हैं। मुझे पता है कि आप सिंटैक्स के बारे में निश्चित रूप से एक सबक्वायरी कर सकते हैं। – BostonMacOSX

+3

फ़ोन पर टैप करना इतना आसान नहीं है ... –

1

मुझे लगता है कि आपको क्या चाहिए ASSIGNMENT_GROUP मैदान पर GROUP BY उपयोग करने के लिए है छोड़ दिया है मिल में शामिल हो।

http://www.w3schools.com/sql/sql_groupby.asp

+0

मुझे नहीं लगता कि मुझे जो चाहिए वह मिल जाएगा क्योंकि मुझे अन्य क्षेत्रों में अन्य जानकारी की भी आवश्यकता है। मुझे अजीब सामान करना होगा जैसे उन्हें संयोजित करना। – BostonMacOSX

-3

आप सबक्वेरी उपयोग कर सकते हैं - चयन शीर्ष 1

+1

जो केवल SQL सर्वर –

+0

के लिए कार्य सीमा 1 का उपयोग करता है। कोई बड़ी बात नहीं। – ZERO

+3

ओरेकल भी 'LIMIT' खंड का समर्थन नहीं करता है। –

1

में आप एक उप क्वेरी चयन बना सकते हैं समर्थन करता है तो ओरेकल, यदि आप 1 परिणाम चाहते हैं, तो आप ROWNUM कथन का उपयोग क्वेरी के पहले एन मान प्राप्त करने के लिए कर सकते हैं उदाहरण:

SELECT * 
FROM TABLEX 
WHERE 
ROWNUM = 1 --gets the first value of the result 

इस एकल क्वेरी के साथ समस्या यह है कि ओरेकल एक ही क्रम में डेटा कभी वापस नहीं देता है। तो, इससे पहले कि आप उपयोग ROWNUM अपने डेटा ओडर चाहिए:

SELECT * 
FROM 
    (SELECT * FROM TABLEX ORDER BY COL1) 
WHERE 
ROWNUM = 1 

अपने मामले के लिए, लगता है कि आप केवल 1 परिणाम की जरूरत है, तो आपकी क्वेरी तरह दिखना चाहिए:

SELECT * 
FROM 
    TABLE1 T1 
    LEFT JOIN 
    (SELECT * 
    FROM TABLE2 T2 WHERE T1.ASSIGNMENT = T2.ASSIGNMENT_GROUP 
    AND 
    ROWNUM = 1) T3 ON T1.ASSIGNMENT = T3.ASSIGNMENT_GROUP 
+0

क्या यह मुझे तालिका 1 से 1 पंक्ति तक सीमित नहीं करेगा? मैं से केवल 1 पंक्ति की जरूरत में शामिल होने तालिका 2 प्रत्येक लेकिन तालिका वाली सभी पंक्तियां 1. – BostonMacOSX

+0

@BostonMacOSX पहले से ही मेरा उत्तर –

+1

आप संदर्भ नहीं दे सकता 'T1.ASSIGNMENT' कि आपके इनलाइन दृश्य की ही तरह संपादित के बाद से' T1' में परिभाषित किया गया है प्रश्न का एक उच्च स्तर। आप एक विश्लेषणात्मक फ़ंक्शन जोड़ सकते हैं जो 'T2.ASSIGNMENT_GROUP' द्वारा विभाजन है और फिर शामिल मानदंडों में रैंक शामिल करें (इसका एक उदाहरण नीचे है)। या आप 'टी 2' के खिलाफ क्वेरी को अपनी' चयन 'सूची में स्केलर सबक्वायरी में ले जा सकते हैं, हालांकि यह बहुत कम कुशल हो सकता है। –

0

MySQL में सिर्फ ग्रुप आप कर सकते थे असाइनमेंट द्वारा और किया जाना चाहिए। ओरेकल अधिक सख्त है और केवल चुनने के लिए मना कर देता है (एक अनिर्धारित तरीके से) जो तीन पंक्तियों के मूल्यों को चुनने के लिए है। इसका मतलब है कि सभी लौटाए गए कॉलम को ग्रुप बाय का हिस्सा होना चाहिए या एक समेकित फ़ंक्शन (COUNT, MIN, MAX ...)

पर आप निश्चित रूप से देखभाल नहीं कर सकते हैं और कुछ समेकित फ़ंक्शन का उपयोग कर सकते हैं लौटा कॉलम।

select TICKET_ID, ASSIGNMENT, MAX(MANAGER_NAME), MAX(USER) 
from T1 
left join T2 on T1.ASSIGNMENT=T2.ASSIGNMENT_GROUP 
group by TICKET_ID, ASSIGNMENT 

यदि आप ऐसा करते हैं तो मुझे गंभीरता से संदेह होगा कि आपको पहले स्थान पर जॉइन की आवश्यकता है।

MySQL इस मामले में GROUP_CONCAT के साथ भी मदद कर सकता है कि आप कॉलम के लिए समूह मानों की एक स्ट्रिंग कॉन्सटेनेशन चाहते हैं (इंसान अक्सर ऐसा करते हैं), लेकिन ओरेकल के साथ staggeringly complex है।

उदाहरण के लिए पहले से सुझाए गए सबक्वायरी का उपयोग करना एक विकल्प है, look here एक उदाहरण के लिए। यह आपको शीर्ष पंक्ति चुनने से पहले सबक्वायरी को सॉर्ट करने की अनुमति देता है।

+0

यह सवाल ओरेकल के बारे में है, इसलिए सभी चीजों को आप एक अलग DB में क्या कर सकते हैं – Forage

5

आप कुछ इस तरह कर सकता है।

SELECT t1.ticket_id, 
     t1.assignment, 
     t2.manager_name, 
     t2.user 
    FROM table1 t1 
     LEFT OUTER JOIN (SELECT manager_name, 
           assignment_group, 
           user, 
           row_number() over (partition by assignment_group 
                --order by <<something>> 
               ) rnk 
          FROM table2) t2 
        ON ( t1.assignment = t2.assignment_group 
         AND t2.rnk = 1) 

यह assignment_group द्वारा table2 में डेटा विभाजन और उसके बाद मनमाने ढंग से उन्हें शुमार assignment_group प्रति एक मनमाना पंक्ति खींचने के लिए। यदि आप परवाह है कि कौन सी पंक्ति लौटा दी गई है (या यदि आप पंक्ति को निर्धारिती लौटा देना चाहते हैं) तो आप विश्लेषणात्मक फ़ंक्शन में ORDER BY खंड जोड़ सकते हैं।

+0

बात आप कृपया जोड़े जा सके नहीं है आदेश खंड –

+1

@RuneJeppesen से (शायद बाहर अपनी पंक्ति में टिप्पणी की) - का एक उदाहरण जोड़ा गया ' द्वारा आदेश '। –

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

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