Лучше / эффективнее использовать подзапросы или операторы SELECT в предложении WHERE (в MS Access) - PullRequest
6 голосов
/ 21 июня 2011

У меня есть база данных 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

Я хотел бы написать запрос, чтобы определить, кто получил наивысший сокр за каждую дату, то есть результат:

Date   Score Name
1/6/11    10 Sarah
2/6/11     4 Dave
3/6/11     1 Dan
4/6/11    11 Dan

Я могу придумать два решения этой проблемы (я открыт для альтернативных предложений):

1) Напишите запрос, чтобы найти минимальную оценку для каждой даты, затем второй запрос, соединяющий первый запрос с исходной таблицей. i.e.:

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

[Они могут быть объединены в один запрос:

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

но я предпочитаю держать их отдельно, чтобы другим было легче им следовать, т. Е. Они могут использовать интерфейс Access, не зная SQL]

2) Написать один запрос с другим простым запросом в предложении WHERE (это новый метод, о котором я только что прочитал, у него есть имя?), Т. Е .:

SELECT * FROM ScoresTable WHERE Score = 
  (SELECT MAX(Score) FROM ScoresTable AS st WHERE st.Date = ScoresTable.Date)

Последний явно более элегантный, но, кажется, работает медленнее. Какой вариант лучше? Наборы данных могут быть довольно большими.

1 Ответ

2 голосов
/ 21 июня 2011

Ваш единственный составной запрос уже выглядит оптимальным для меня, я сомневаюсь, что вы можете сделать проще или эффективнее.
Разумное использование индексов в вашей таблице должно гарантировать, что запрос выполняется довольно быстро.

Ваш последний запрос называется Коррелированный подзапрос .
Это иногда полезно, но может быть очень медленным: подзапрос должен быть выполнен для каждой записи в ScoresTable, потому что результат подзапроса зависит от значения каждой отдельной записи в ScoresTable.
Для ядра базы данных это довольно сложно оптимизировать.

Если вам интересно узнать подробности о том, как планировщик запросов оптимизирует ваши запросы, взгляните на эти статьи, они покажут вам, что у вас под рукой:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...