我的SQL查询中存在问题
我想选择DISTINCT StudentGroups(SG),但查询给了我一些重复
这是我的查询
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
已更新
此查询为我提供了以下数据
但我不想重复SGID
答案 0 :(得分:14)
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
子句添加更多字段,以进一步定义返回的行。
答案 1 :(得分:6)
当DISTINCT不能用于您想要的输出时,请使用GROUP BY子句。