我有一个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)
后者显然更优雅,但似乎运行得更慢.哪个更好?数据集可以变得非常大.
您的单个复合查询对我来说已经是最佳选择,我怀疑您是否可以做得更简单或更有效。
明智地使用表中的索引应确保查询运行得相当快。
您的最后一个查询称为相关子查询。
它有时很有用,但可能非常慢:需要对 ScoresTable 中的每个记录执行子查询,因为子查询的结果取决于 ScoresTable 中每个单独记录的值。
这对于数据库引擎来说是比较难优化的。
如果您有兴趣了解有关查询规划器如何优化查询的详细信息,请查看这些文章,它们将向您展示幕后内容:
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |