2013-02-21 51 views
7

我在SQL查詢有問題如何獲得不同的值在SQL查詢

我想選擇DISTINCT StudentGroups(SG),但查詢給了我一些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 

修訂

此查詢給我下面的數據

enter image description here

,但我不想重複SGID

+6

'DISTINCT'是***不是***功能。這是*運算符*應用於選擇列表中的所有**列。 – 2013-02-21 10:06:34

+7

DISTINCT對**整行**起作用:不能在與其他列相同的結果集中獲取DISTINCT SGID值。這是沒有意義的... – gbn 2013-02-21 10:07:29

+1

那麼我怎麼能得到獨特的記錄? @a_horse_with_no_name,@ gbn – 2013-02-21 10:12:04

回答

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不能用於所需的輸出時,請使用GROUP BY子句。