2013-02-21 20 views
7

मैं अपने एसक्यूएल क्वेरी में एक समस्या हैकैसे एसक्यूएल में विशिष्ट मूल्यों को प्राप्त करने के लिए क्वेरी

मैं DISTINCT StudentGroups (एसजी) का चयन करना चाहते हैं, लेकिन क्वेरी मुझे कुछ repetations

यहाँ मेरी क्वेरी

है देता है
SELECT  DISTINCT(SG.SGID), en.EnrollmentID, CR.Name AS Course, INS.Name as Instructor, 
       S.Session, SG.StartTime, SG.EndTime, EN.CreateDate 

    FROM  StudentGroups SG inner JOIN Enrollments EN ON SG.SGID = EN.SGID 
       JOIN Courses CR ON SG.CourseID = CR.CourseID 
       JOIN Class CL ON SG.ClassID = CL.ClassID 
       JOIN Instructors INS ON SG.InstructorID = INS.InstructorID 
       JOIN Sessions S ON SG.SessionID = S.SessionID 

    WHERE  EN.SGID NOT IN (SELECT SGID FROM Enrollments 
          WHERE StudentID = 45 

UPDATED

इस क्वेरी देता है मुझे डेटा निम्नलिखित

enter image description here

लेकिन मैं बार-बार नहीं करना चाहती sgid

+6

'DISTINCT' *** *** एक समारोह नहीं है। यह एक * ऑपरेटर * चुनिंदा सूची में ** सभी ** कॉलम पर लागू है। –

+7

DISTINCT ** पूरी ** पंक्ति पर काम करता है: आप अन्य कॉलम के साथ सेट किए गए परिणाम में DISTINCT SGID मान नहीं प्राप्त कर सकते हैं। यह कोई समझ नहीं आता है ... – gbn

+1

तो मैं अद्वितीय रिकॉर्ड कैसे प्राप्त कर सकता हूं ?? @a_horse_with_no_name, @ gbn –

उत्तर

13

DISTINCT हमेशा सभी कॉलम लौटे लागू होता है। एक कॉलम के चारों ओर कोष्ठक डालने से उसके व्यवहार में कोई फर्क नहीं पड़ता है।

आप SG.GID का केवल अनन्य मान शामिल करने के लिए अपने परिणाम चाहते हैं, आप एक GROUP BY खंड के बजाय का उपयोग कर सकते हैं - लेकिन फिर आप को महत्व देता है जिसके लिए आप दूसरे कॉलम के लौटना चाहते कुछ नियम तय करने के लिए। आप MIN() तरह कुल कार्यों का उपयोग कर, MAX(), COUNT(), SUM(), आदि सरलीकृत उदाहरण ऐसा करते हैं:

SELECT SG.SGID, 
     MIN(SG.START_TIME),    --the lowest start time for this sgid. 
     COUNT(DISTINCT en.EnrollmentID) --the unique enrollments for this sgid. 
    FROM StudentGroups SG 
    INNER JOIN Enrollments EN ON SG.SGID = EN.SGID 
    GROUP BY SG.SGID; 

जब आपकी मूल क्वेरी में के रूप में कई तालिकाओं में शामिल होने के लिए, आप के रूप में जब गिनती और चीजों को संक्षेप में सावधान रहना होगा, है शामिल होने से डुप्लीकेट आपको गलत परिणाम दे सकते हैं।

एक अन्य विकल्प ROW_NUMBER() उपयोग करने के लिए प्रत्येक SGID के लिए एक पंक्ति लौटने के लिए होगा:

SELECT * FROM (
    SELECT SG.SGID, 
      SG.START_TIME, 
      en.EnrollmentID, 
      ROW_NUMBER() OVER (PARTITION BY SGID ORDER BY SG.START_TIME) as RN 
     FROM StudentGroups SG 
     INNER JOIN Enrollments EN ON SG.SGID = EN.SGID 
    ) 
    WHERE RN = 1; 

यह संख्या प्रत्येक SGID के लिए पंक्तियों 1 से शुरू करके और SG.START_TIME का मूल्य के अनुसार क्रमबद्ध। यह प्रत्येक पंक्ति को प्रत्येक SGID के लिए शुरुआती प्रारंभ समय के साथ वापस कर देगा। यदि एकाधिक पंक्तियों में एक ही प्रारंभ समय होता है, तो यह यादृच्छिक रूप से उनमें से किसी एक का चयन करेगा। आप ORDER BY खंड में और फ़ील्ड जोड़ सकते हैं ताकि आगे की पंक्तियां वापस आ सकें।

5

कृपया ग्रुप बाय क्लॉज का उपयोग करें जब DISTINCT आपके वांछित आउटपुट के लिए काम नहीं कर रहा है।