使用JOIN而不使用ORDERBY时的相关行排序



假设我们有两个表:

user:
id,name                             
1,bob
2,alice
user_group:
id,user_id,group
1,1,g1
2,1,g2
3,2,g2
4,2,g3

我们不能保证在每次执行没有ORDER BYSELECT * FROM user时,结果集将具有相同的顺序。但是联接中的相关行呢?

例如,SELECT user.name, user_group.group FROM user INNER JOIN user_group ON (user.id = user_group.user_id);。相关的(连接的(行在结果集中是否相邻(以PostgreSQL为例(?我的意思是:

bob,g1
bob,g2
alice,g2
alice,g3

alice,g3
alice,g2
bob,g2
bob,g1

而不是这个:

bob,g1
alice,g2
bob,g2
alice,g3

users的顺序无关紧要,每个usergroups的顺序也太

SQL中的一条基本规则是,除非添加ORDER BY,否则永远不能依赖结果集的排序。如果没有ORDER BY,则结果集的排序可能取决于

  • PostgreSQL读取单个表的顺序-它可以是索引顺序或顺序顺序,即使使用顺序扫描,也不总是得到相同的顺序(除非禁用synchronize_seqscans(

  • 选择的联接策略(嵌套循环、散列联接或合并联接(

  • 查询返回的行数(如果使用游标,PostgreSQL会优化查询,以便快速返回第一行(

也就是说,以您的特定示例和PostgreSQL作为数据库,我认为所有的联接策略都不会按照您所描述的不希望的顺序返回结果集。但我不会依赖这一点:通常,优化器会找到一种令人惊讶的方式来处理查询。

为自己节省ORDER BY的愿望通常来自于优化处理速度的愿望。但正确性比速度更重要,PostgreSQL通常可以找到一种方法,以所需的顺序返回结果,而不必显式排序。

最新更新