sql - 奇怪的 postgres SELECT 排序问题

标签 sql ruby-on-rails postgresql select

我有这个 postgres sql 查询:

select * from stats where athlete_id = 5

如您所想,这将返回每个 id 为 5 的运动员的所有统计数据

到目前为止一切正常。

但是我刚刚注意到,对于高于 110 的 athlete_id,它会以相反的顺序返回统计数据行。

所以对于 athlete_id = 110,'id' 列是这样的,这是我习惯的:

2325
2401
2482
2537
2592
2647
...

等每个统计表行按 ID 排序。

然后如果你选择111,结果是这样的:

5652
5610
5569
5528
5487
5437
5387
5336
...

这怎么可能?这都是在 pgadmin 界面内进行查询。没有额外的 where 子句,只有我所说的那个,即 WHERE athlete_id = 111

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

110 和 111 之间发生了什么? rails 中有很多重构和代码更改,但没有实际的直接 SQL 操作。是的,我知道答案可能在那里,但我不知道怎么看,因为这不在 rails 应用程序中——这是通过 pgadmin 的纯 SQL,所以一定是在 postgres 中做了一些事情——我需要了解什么那可能是或者我无法调试。

有什么想法吗?在 Rails 中,类似的东西:

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

完全糊涂了!

最佳答案

如果您不指定 ORDER BY 子句,则保证返回行的顺序。它们可能是升序、降序、没有它有明显的逻辑,每次查询时甚至可能有不同的顺序(尽管这在实践中不太可能发生)。

您返回的具体顺序取决于查询计划中步骤的实现细节。当您更改参数时,它可能会导致 PostgreSQL 更喜欢一个查询计划而不是另一个。例如,它可能决定对一个查询使用表扫描,而对另一个查询使用索引。很难确切知 Prop 体情况下的原因,但查看 EXPLAIN 的结果可能会给出一些提示。

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

SELECT *
FROM stats
WHERE athlete_id = 5
ORDER BY id

关于sql - 奇怪的 postgres SELECT 排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512758/

相关文章:

php - 使用PHP从sql中获取有限的数据

ruby-on-rails - 如何使用 Formtastic 更改标签的类别

ruby-on-rails - 使用simple_form和zurb基础创建内联date_select下拉列表

javascript - pipe() 数据到 Json 文件或到 PostgreSQL

sql - Postgresql 独特语句

sql - Postgresql 选择直到达到一定的总量

sql - 在 PostgreSQL 中使用 LEFT JOIN 而不是 NOT IN

sql - 如何查看SQL存储过程的运行进度?

ruby-on-rails - Rails 4.2 Active Job Resque Enqueue 未定义方法问题

c - libpq-fe,无法选择 INT8