2010-07-26 133 views
2

假设我有如下表为多个列选择最大值?

Students (StudentID, StudentName) 
StudentMarks (StudentID, Mark) 

我需要选择具有最高分的学生..如果有一个以上的学生有相同的标记(和它的最高分)。根据然后选择命名(字母)

我该怎么做?在此先感谢

+1

我只是看了以前的作业文件从去年的底漆:) – 2010-07-26 13:44:32

+0

这功课? – 2010-07-26 13:44:39

+1

你只能从这个查询中得到一个结果吗? – NullUserException 2010-07-26 13:44:49

回答

1
SELECT s.StudentName, sm.Mark 
FROM Students s 
INNER JOIN StudentMarks sm ON sm.StudentID = s.StudentID 
WHERE sm.Mark = (SELECT MAX(Mark) FROM StudentMarks) 
ORDER BY s.StudentName 
1

我已经怎么样

select * 
from students s 
inner join studentmarks m on m.studentid = s.studentid 
where m.mark = (select Max(mark) from studentmarks) 
order by s.StudentName 
2

没有测试过这一点,但它听起来正确

SELECT StudentID, StudentName 
FROM Students 
JOIN StudentMarks USING (StudentID) 
WHERE Mark = 
    (SELECT MAX(Mark) FROM StudentMarks) 
ORDER BY StudentName 
+0

'StudentMarks.Mark'也可以缩写为'Mark'。 – Powerlord 2010-07-26 14:02:34

0

其他选项

SELECT * FROM Students where StudentId in (SELECT StudentID FROM Mark Where Mark = Max(Max)); 

SELECT s.* FROM Students where exists (SELECT StudentID FROM Mark m Where Mark = Max(Max) and m.StudentId = s.StudentId); 
0

如果您的RDBMS支持解析函数

WITH Ranked AS 
(
SELECT RANK() OVER(ORDER BY Mark DESC) AS Rnk, 
Students.StudentID, 
Students.StudentName, 
Mark 
FROM Students 
JOIN StudentMarks ON Students.StudentID = StudentMarks.StudentID 
) 
SELECT StudentID, 
     StudentName, 
     Mark 
FROM Ranked 
WHERE Rnk=1 
ORDER BY StudentName 

或为规范的其他解释...

WITH RowNumbered AS 
(
SELECT ROW_NUMBER() OVER(ORDER BY Mark DESC, StudentName ASC) AS Num, 
Students.StudentID, 
Students.StudentName, 
Mark 
FROM Students 
JOIN StudentMarks ON Students.StudentID = StudentMarks.StudentID 
) 
SELECT StudentID, 
     StudentName, 
     Mark 
FROM RowNumbered 
WHERE Num=1 
0

这只是需要一个简单的加入,并选择第一条记录.. (,根据规格进行预订)

SELECT TOP 1 
    S.StudentName, SM.Mark 
FROM 
    Students S 
    INNER JOIN StudentMarks SM ON SM.studentID = S.StudentID 
ORDER BY 
    SM.Mark DESC, 
    S.StudentName ASC 
+0

我没有downvote你,但是这个语法只是SQL Server(并且需要'WITH TIES'来匹配规范) - 尽管实际上这可能仍然不起作用,因为你在ORDER BY中有2个cols。 – 2010-07-26 14:23:21

+0

@downvoter,我将不胜感激评论为downvote的原因.. – 2010-07-26 14:23:40

+0

@实际上又读过这个问题 - 我不知道我提出的第二点。我不清楚规格。 – 2010-07-26 14:27:40

0

......怎么

SELECT * 
    FROM Students 
    WHERE StudentID IN (SELECT StudentID 
          FROM StudentMarks 
          WHERE Mark = (SELECT MAX(Mark) 
               FROM StudentMarks)) 
    ORDER BY StudentName 
    LIMIT 1; 

(上VASH的回答扩展到从中取出非标准功能)。

+1

从这里我不认为'LIMIT'是在任何标准http://troels.arvin.dk/db/rdbms/#select-limit – 2010-07-26 14:45:15

+0

你可能是对的;我总是被教导“限制n行”,但尽管这是几乎任何人都实现的标准。从我在这个网站上看到的,几乎没有人使用它... – 2010-07-26 14:52:18