Tôi có cơ sở dữ liệu MS Access có chứa bảng ngày, điểm số và những người có liên quan đến điểm đó, ví dụ:Có tốt hơn/hiệu quả hơn khi sử dụng truy vấn phụ hoặc câu lệnh SELECT trong mệnh đề WHERE (trong MS Access)
Date Score Name 1/6/11 5 Dave 1/6/11 10 Sarah 2/6/11 4 Dave 2/6/11 3 Graham 3/6/11 1 Dan 4/6/11 11 Dan 4/6/11 9 Graham
Tôi muốn viết một truy vấn để tìm những người đã nhận socre cao nhất trên mỗi ngày, tức là một kết quả của:
Date Score Name 1/6/11 10 Sarah 2/6/11 4 Dave 3/6/11 1 Dan 4/6/11 11 Dan
tôi có thể nghĩ ra hai giải pháp cho vấn đề này (tôi mở với các đề xuất thay thế), như sau:
1) Viết truy vấn để tìm điểm tối thiểu cho mỗi ngày, sau đó truy vấn thứ hai tham gia truy vấn đầu tiên vào bảng gốc. ví dụ:
Query1:
SELECT Date, MAX(Score) AS MaxScore FROM ScoresTable GROUP BY Date
Query2:
SELECT ScoresTable.*
FROM ScoresTable INNER JOIN Query1
ON ScoresTable.Date = Query1.Date
AND ScoresTable.Score = Query1.MaxScore
[Đây có thể được kết hợp như một truy vấn duy nhất:
SELECT ScoresTable.*
FROM ScoresTable INNER JOIN
(SELECT Date, MAX(Score) AS MaxScore
FROM ScoresTable GROUP BY Date) Query1
ON ScoresTable.Date = Query1.Date
AND ScoresTable.Score = Query1.MaxScore
nhưng tôi muốn giữ chúng riêng biệt để làm cho dễ dàng hơn cho những người khác theo dõi, tức là họ có thể sử dụng giao diện Truy cập mà không biết SQL]
2) Viết một truy vấn duy nhất với một truy vấn đơn giản trong mệnh đề WHERE (đây là một phương pháp mới, tôi chỉ mới đọc về, nó có một cái tên), ví dụ:?
SELECT * FROM ScoresTable WHERE Score =
(SELECT MAX(Score) FROM ScoresTable AS st WHERE st.Date = ScoresTable.Date)
Sau rõ ràng là thanh lịch hơn, nhưng dường như chạy chậm hơn. Lựa chọn nào tốt hơn? Các tập dữ liệu có thể nhận được khá lớn.
Tôi nghĩ rằng JOIN cho truy vấn phụ luôn thích hợp hơn với truy vấn phụ trong WHERE, nhưng nó phụ thuộc vào ngữ cảnh - bạn có thể ở trong vị trí mà bạn phải sử dụng nó trong mệnh đề WHERE (ví dụ, để chỉnh sửa). –