Trả lời câu hỏi ĐÃ CHỈNH SỬA (tức là cũng nhận được các cột được liên kết).
Trong Sql Server 2005+, cách tốt nhất sẽ là sử dụng xếp hạng / cửa sổ chức năng kết hợp với CTE , như thế này:
with exam_data as
(
select r.student_id, r.score, r.date,
row_number() over(partition by r.student_id order by r.score desc) as rn
from exam_results r
)
select s.name, d.score, d.date, d.student_id
from students s
join exam_data d
on s.id = d.student_id
where d.rn = 1;
Đối với giải pháp tuân thủ ANSI-SQL, một truy vấn con và tự nối sẽ hoạt động, như sau:
select s.name, r.student_id, r.score, r.date
from (
select r.student_id, max(r.score) as max_score
from exam_results r
group by r.student_id
) d
join exam_results r
on r.student_id = d.student_id
and r.score = d.max_score
join students s
on s.id = r.student_id;
Điều cuối cùng này giả định rằng không có kết hợp student_id / max_score trùng lặp, nếu có và / hoặc bạn muốn lập kế hoạch loại bỏ trùng lặp chúng, bạn sẽ cần sử dụng một truy vấn con khác để kết hợp với một cái gì đó xác định để quyết định bản ghi nào sẽ kéo . Ví dụ:giả sử bạn không thể có nhiều hồ sơ cho một học sinh nhất định với cùng một ngày, nếu bạn muốn vượt qua mối quan hệ dựa trên điểm max_score gần đây nhất, bạn sẽ làm như sau:
select s.name, r3.student_id, r3.score, r3.date, r3.other_column_a, ...
from (
select r2.student_id, r2.score as max_score, max(r2.date) as max_score_max_date
from (
select r1.student_id, max(r1.score) as max_score
from exam_results r1
group by r1.student_id
) d
join exam_results r2
on r2.student_id = d.student_id
and r2.score = d.max_score
group by r2.student_id, r2.score
) r
join exam_results r3
on r3.student_id = r.student_id
and r3.score = r.max_score
and r3.date = r.max_score_max_date
join students s
on s.id = r3.student_id;
CHỈNH SỬA:Đã thêm truy vấn khử trùng lặp thích hợp nhờ Mark nắm bắt tốt các nhận xét