繁体   English   中英

奇怪的Postgres SELECT订购问题

[英]Strange postgres SELECT ordering issue

我有这个postgres sql查询:

select * from stats where athlete_id = 5

如您所料,这将返回ID为5的每个运动员的所有统计信息

到目前为止,一切正常。

但是我只是注意到,对于110以上的田径运动员,它以相反的顺序返回统计信息行。

因此,对于sports_id = 110,“ id”列如下所示:

2325
2401
2482
2537
2592
2647
...

等等。每个统计信息表行按ID顺序排列。

然后,如果您选择111,则结果如下:

5652
5610
5569
5528
5487
5437
5387
5336
...

这怎么可能呢? 这些都是在pgadmin界面内进行的查询。 没有其他的where子句,只有我已经说过的,即WHERE SPORTS_ID = 111

什么? 我一直在进行各种代码更改,但是到底是什么会在pgaadmin / pgsql中导致此更改?

110和111之间发生了什么? Rails内部进行了大量的重构和代码更改,但没有实际的直接SQL操作。 是的,我知道答案可能在那里,但我不知道外观,因为它不在Rails应用程序中-这是通过pgadmin进行的纯SQL,所以必须在postgres中完成一些操作-我需要了解可能是这样,或者我无所适从。

有任何想法吗? 在rails中,诸如:

Athlete.stats.last.score返回“第一”行而不是“最后”行,完全搞砸了应用程序,但仅适用于ID大于110的运动员!

完全困惑!

如果不指定ORDER BY子句,则不能保证行将以什么顺序返回。它们可以是升序,降序,没有明显逻辑的顺序,甚至可能不同每次查询时都进行排序(尽管实际上不太可能发生)。

您获得的具体顺序取决于查询计划中各步骤的实施细节。 更改参数时,它可能导致PostgreSQL优先选择一种查询计划。 例如,它可能决定对一个查询使用表扫描,而对另一个查询使用索引。 很难确切了解具体情况的原因,但是查看EXPLAIN的结果可能会给出一些提示。

要修复查询以按期望的顺序返回行,请添加ORDER BY子句:

SELECT *
FROM stats
WHERE athlete_id = 5
ORDER BY id

除非您在查询中指定ORDER BY子句,否则您不能假设/期望SQL将以任何特定顺序将数据返回给您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM