2011-06-21 31 views
6

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.

+0

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). –

Trả lời

2

Truy vấn tổng hợp đơn của bạn đã tối ưu với tôi, tôi nghi ngờ rằng bạn có thể làm đơn giản hơn hoặc hiệu quả hơn.
Việc sử dụng các chỉ mục cẩn thận trong bảng của bạn phải đảm bảo rằng truy vấn chạy khá nhanh.

Truy vấn cuối cùng của bạn được gọi là Correlated subquery.
Đôi khi nó hữu ích, nhưng có thể rất chậm: truy vấn phụ sẽ cần phải được thực hiện cho mỗi bản ghi trong Bảng điểm vì kết quả của truy vấn con phụ thuộc vào giá trị của mỗi bản ghi riêng lẻ trong Bảng điểm.
Điều này khá khó cho công cụ cơ sở dữ liệu để tối ưu hóa.

Nếu bạn quan tâm đến việc tìm hiểu thông tin chi tiết về cách thức lập kế hoạch truy vấn tối ưu hóa truy vấn của bạn, có một cái nhìn tại những bài viết này, họ sẽ cho bạn thấy những gì là dưới mui xe:

Các vấn đề liên quan