2010-07-26 5 views
2

Предположим, у меня есть следующая таблицавыберите max для более чем одного столбца?

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

мне нужно выбрать студента с высшей отметкой .. если есть больше чем один студент имеет один и тот же знак (и его самая высокая оценка) .. затем выберите в соответствии для указания порядка (по алфавиту)

Как я могу это сделать? Заранее спасибо

+1

Я бы только посмотрел предыдущую домашнюю работу из прошлых лет: –

+0

Это домашнее задание? –

+1

Вы получаете только один результат из этого запроса? – NullUserException

ответ

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

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

Я не спустил вас вниз, но этот синтаксис - это только SQL Server (и в любом случае он должен был бы «WITH TIES» соответствовать спецификации). Хотя на самом деле это, вероятно, все равно не будет работать, поскольку у вас есть 2 cols в ORDER BY. –

+0

@downvoter, я был бы признателен за комментарий к причине downvote .. –

+0

@ На самом деле снова прочитал вопрос - я не уверен в том, что я сделал второй момент. Я не совсем понял эту спецификацию. –

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 –

+0

Возможно, вы правы; Меня всегда учили «LIMIT TO n ROWS», но, хотя это стандартно, вряд ли кто-либо его реализует. Из того, что я видел на этом сайте, вряд ли кто-нибудь его использует ... –

Смежные вопросы