ms是否通过订购结果来访问组?

时间:2016-03-06 09:10:45

标签: sql ms-access

我需要运行一个查询,对结果进行分组并对其进行排序。当我使用以下查询时,我注意到结果是按字段name排序的:

SELECT name, count(name) 
FROM contacts 
GROUP BY name 
HAVING count(name)>1 

最初我计划使用以下查询:

SELECT name, count(name) 
FROM contacts 
GROUP BY name 
HAVING count(name)>1
ORDER BY name

我担心顺序会大大减慢运行时间。 我是否可以依赖ms-access始终按我分组的字段排序,并通过消除顺序?

编辑:我尝试将其他表中的不同字段分组,并且始终按分组字段排序。

我已经向其他SQL DBMS找到了这个问题的答案,但没有找到。

2 个答案:

答案 0 :(得分:8)

GROUP BYORDER BY如何正常工作

在为GROUP BYDISTINCT操作创建组时,数据库通常会在排序和散列之间进行选择。如果他们确实选择了排序,那么您可能会很幸运,并且GROUP BY的应用与实际结果集消耗之间的排序是稳定的。但是稍后,由于数据库可能突然更喜欢无顺序散列算法来生成组,因此可能会中断。

no database 中,您应该依赖任何隐式排序行为。您应始终使用显式ORDER BY。如果数据库足够复杂,添加显式ORDER BY子句将提示排序对于分组操作也更为理想,因为排序可以在查询执行管道中重复使用。

这如何转化为您的观察

  

我尝试将其他表中的不同字段分组,并且始终按分组字段排序。

您是否详尽地尝试了所有可能表达的查询?即你尝试过了吗?

  • JOIN
  • OUTER JOIN
  • 半 - JOIN(使用EXISTSIN
  • 反 - JOIN(使用NOT EXISTSNOT IN
  • 过滤
  • 按多列分组
  • DISTINCT + GROUP BY(这肯定会破坏您的订购)
  • UNIONUNION ALL(无论如何都打败了这个论点)

我打赌你没有。即使您尝试了上述所有内容,您是否可以确定上面没有一个非常特殊的配置,只是因为您已经观察到某些(许多)实验中的行为? / p>

你不能。

MS Access特定行为

就MS Access而言,请考虑documentation on ORDER BY

  

<强>说明
  ORDER BY是可选的。但是,如果您希望数据按排序顺序显示,则必须使用ORDER BY。

注意措辞。 “你必须使用ORDER BY”。因此,MS Acces与其他数据库没什么不同。

答案

所以你关于表现的问题是朝着错误的方向发展的。在这种情况下,您不能牺牲性能的正确性。通过使用索引更好地解决性能问题。

答案 1 :(得分:3)

以下是Access SQL中GROUP BY子句的MSDN文档:

https://msdn.microsoft.com/en-us/library/bb177905(v=office.12).aspx

该页面未提及结果的任何隐含或自动排序 - 如果您确实看到了没有明确ORDER BY的所需排序,那么这完全是巧合。

唯一的方法保证SQL中结果的特定顺序是ORDER BY

使用ORDER BY(通常) 是一个轻微的性能问题,因为它需要DBMS在输出第一行结果之前先获取所有结果(尽管DBMS可以自由地使用&#34;在线排序&#34;算法在从后备存储中获取每一行时对数据进行排序,它仍然需要从后备存储中获取最后一行,然后才能将第一行返回到客户端(如果后备存储的最后一行恰好是根据ORDER BY的第一个结果) - 但是除非您在延迟敏感的应用程序中查询数万行,否则这是不是问题 - 而且当您使用Access时,很明显这不是对性能敏感的应用程序。