2011-06-21 47 views
6

我有一个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) 

后者显然更优雅,但似乎跑得更慢。哪个更好?数据集可能会变得很大。

+0

我认为JOIN子查询总是比WHERE中的子查询更可取,但它取决于上下文 - 您可能处于必须在WHERE子句中使用它的位置(例如,为了可编辑性)。 –

回答

2

你的单一复合查询已经看起来最适合我,我怀疑你可以做得更简单或更高效。
明智地使用表中的索引应确保查询运行得非常快。

您最后的查询被称为Correlated subquery
它有时很有用,但速度可能很慢:子查询将需要为ScoresTable中的每个记录执行,因为子查询的结果取决于ScoresTable中每个单独记录的值。
这对数据库引擎优化来说是相当困难的。

如果你有兴趣在寻找出关于查询规划如何优化你的查询详情,看看这些文章,他们会告诉你的引擎盖下是什么:

相关问题