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

MJH*_*MJH 4 sql ms-access

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

SELECT name, count(name) 
FROM contacts 
GROUP BY name 
HAVING count(name)>1 
Run Code Online (Sandbox Code Playgroud)

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

SELECT name, count(name) 
FROM contacts 
GROUP BY name 
HAVING count(name)>1
ORDER BY name
Run Code Online (Sandbox Code Playgroud)

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

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

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

Luk*_*der 8

如何GROUP BYORDER BY一般的工作

在为组GROUP BYDISTINCT操作创建组时,数据库通常在排序和散列之间进行选择.如果他们确实选择排序,您可能会很幸运,并且在应用程序GROUP BY和实际结果集消耗之间排序是稳定的.但是在稍后的某些时候,这可能会破坏,因为数据库可能突然更喜欢无顺序散列算法来生成组.

没有数据库的情况下,您应该依赖任何隐式排序行为.你应该总是使用显式ORDER BY.如果数据库足够复杂,添加显式ORDER BY子句将提示排序对于分组操作也更为理想,因为排序可以在查询执行管道中重复使用.

这如何转化为您的观察

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

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

  • JOIN
  • OUTER JOIN
  • JOIN(使用EXISTSIN)
  • JOIN(使用NOT EXISTSNOT IN)
  • 滤波
  • 按许多列分组
  • DISTINCT+ GROUP BY(这肯定会破坏你的订购)
  • UNION或者UNION ALL(无论如何都打败了这个论点)

我打赌你没有.即使您尝试了上述所有内容,您是否可以确定上述内容没有非常特殊的配置,只是因为您在一些(许多)实验中观察到了这种行为?

你不能.

MS Access特定行为

就MS Access而言,请考虑文档ORDER BY

备注
ORDER BY是可选的.但是,如果希望数据按排序顺序显示,则必须使用ORDER BY.

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

答案

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