【问题标题】:Is it better / more efficient to use sub queries or SELECT statements within the WHERE clause (in MS Access)在 WHERE 子句中使用子查询或 SELECT 语句是否更好/更有效(在 MS Access 中)
【发布时间】: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 子句中使用它的位置(例如,为了可编辑性)。

标签: sql ms-access


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2021-11-16
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多