【发布时间】:2011-06-21 10:48:54
【问题描述】:
我有一个 MS Access 数据库,其中包含日期、分数和这些分数相关的人的表格,例如
日期 分数名称 2011 年 1 月 6 日 5 戴夫 1/6/11 10 莎拉 2/6/11 4 戴夫 2/6/11 3 格雷厄姆 2011 年 3 月 6 日 1 丹 11 年 4 月 6 日 11 丹 2011 年 4 月 6 日 9 格雷厄姆我想写一个查询来找出每个日期谁得到了最高的分数,即:
日期 分数名称 1/6/11 10 莎拉 2/6/11 4 戴夫 2011 年 3 月 6 日 1 丹 11 年 4 月 6 日 11 丹我可以想到两个解决这个问题的方法(我愿意接受其他建议),如下:
1) 编写查询以查找每个日期的最低分数,然后编写第二个查询将第一个查询与原始表连接起来。即:
查询1:
SELECT Date, MAX(Score) AS MaxScore FROM ScoresTable GROUP BY Date
查询2:
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
但我更喜欢将它们分开,以便其他人更容易理解,即他们可以在不知道 SQL 的情况下使用 Access 接口]
2) 在 WHERE 子句中编写一个带有另一个简单查询的单个查询(这是我刚刚读到的一种新方法,它有名字吗?),即:
SELECT * FROM ScoresTable WHERE Score =
(SELECT MAX(Score) FROM ScoresTable AS st WHERE st.Date = ScoresTable.Date)
后者显然更优雅,但似乎运行得更慢。哪个是更好的选择?数据集可能会变得非常大。
【问题讨论】:
-
我认为子查询的 JOIN 总是比 WHERE 中的子查询更可取,但这取决于上下文 - 您可能处于必须在 WHERE 子句中使用它的位置(例如,为了可编辑性)。