我有一个MS Access数据库,其中包含日期,分数表以及与这些分数相关的人员,例如,在WHERE子句中使用子查询或SELECT语句是否更好/更高效(在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
我想编写一个查询来发现谁得到每个日期的最高socre,即一个结果:
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
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
,但我宁愿让他们分开,使对其他人来说更容易遵循,即他们可以在不知道SQL的情况下使用Access界面]
2)写一个查询与WHERE子句中的另一个简单的查询(这是我刚刚读到了一种新方法,它有一个名字),即:
SELECT * FROM ScoresTable WHERE Score =
(SELECT MAX(Score) FROM ScoresTable AS st WHERE st.Date = ScoresTable.Date)
后者显然更优雅,但似乎跑得更慢。哪个更好?数据集可能会变得很大。
我认为JOIN子查询总是比WHERE中的子查询更可取,但它取决于上下文 - 您可能处于必须在WHERE子句中使用它的位置(例如,为了可编辑性)。 –