在WHERE子句中使用子查询或SELECT语句更好/更有效(在MS Access中)

jof*_*itz 6 sql ms-access

我有一个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)编写查询以查找每个日期的最低分数,然后写入将第一个查询加入原始表的第二个查询.即:

查询1:

SELECT Date, MAX(Score) AS MaxScore FROM ScoresTable GROUP BY Date
Run Code Online (Sandbox Code Playgroud)

QUERY2:

SELECT ScoresTable.* 
FROM ScoresTable INNER JOIN Query1 
  ON ScoresTable.Date = Query1.Date 
  AND ScoresTable.Score = Query1.MaxScore
Run Code Online (Sandbox Code Playgroud)

[这些可以合并为一个查询:

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
Run Code Online (Sandbox Code Playgroud)

但我更喜欢将它们分开以使其他人更容易遵循,即他们可以在不知道SQL的情况下使用Access接口]

2)用WHERE子句中的另一个简单查询编写单个查询(这是我刚刚读过的一个新方法,它有一个名字吗?),即:

SELECT * FROM ScoresTable WHERE Score = 
  (SELECT MAX(Score) FROM ScoresTable AS st WHERE st.Date = ScoresTable.Date)
Run Code Online (Sandbox Code Playgroud)

后者显然更优雅,但似乎运行得更慢.哪个更好?数据集可以变得非常大.

Ren*_*uis 2

您的单个复合查询对我来说已经是最佳选择,我怀疑您是否可以做得更简单或更有效。
明智地使用表中的索引应确保查询运行得相当快。

您的最后一个查询称为相关子查询
它有时很有用,但可能非常慢:需要对 ScoresTable 中的每个记录执行子查询,因为子查询的结果取决于 ScoresTable 中每个单独记录的值。
这对于数据库引擎来说是比较难优化的。

如果您有兴趣了解有关查询规划器如何优化查询的详细信息,请查看这些文章,它们将向您展示幕后内容: