我有这个 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/