现在我遇到了一个问题,我的桌子如下:
Task Id StudentId Marks
1 1 12
1 2 15
1 3 17
2 1 15
2 3 20
3 1 8
3 3 5
3 5 17我被要求得到一个学生名单谁有最大和分数在每项任务。因此,所需的输出是:
TaskId StudentId标记
1 3 17
2 3 20
3 5 17现在,我创建了一个临时表来存储每个任务的max.marks。
TaskId Max.Marks
1 17
2 20
3 17然后,我将临时表加入到主表,并以等于该任务的max.marks的标记获取行。
谁能建议一个更好的查询没有任何子查询和临时表?
谢谢
发布于 2012-07-14 12:11:51
使用子查询(派生表)代替临时表,然后将其连接到原始标记表:
SELECT
t.TaskId, t.StudentId, t.Marks
FROM
tableX AS t
JOIN
( SELECT
TaskID
, MAX(Marks) AS MaxMarks
FROM
tableX
GROUP BY
TaskID
) AS m
ON m.TaskId = t.TaskId
AND m.MaxMarks = t.Marks ;如果您有一个关于(TaskId, Marks, StudentId)的索引,它将有助于提高效率。
您还可以使用此变体:
SELECT
t.TaskId, t.StudentId, t.Marks
FROM
( SELECT DISTINCT
TaskId
FROM
tableX
) AS dt
JOIN
tableX AS t
ON t.TaskId = dt.TaskId
AND t.Marks =
( SELECT
tm.Marks
FROM
tableX AS tm
WHERE
tm.TaskId = dt.TaskId
ORDER BY
tm.Marks DESC
LIMIT 1
) ;https://dba.stackexchange.com/questions/20882
复制相似问题