Dav*_*ave 1 sql postgresql select ruby-on-rails
我有这个postgres sql查询:
select * from stats where athlete_id = 5
Run Code Online (Sandbox Code Playgroud)
正如你想象的那样,这将返回每位身份5的运动员的所有统计数据
到目前为止很正常.
但是我注意到,对于110以上的athlete_id,它会以相反的顺序返回统计数据行.
所以对于athlete_id = 110,'id'列就像这样出来,这就是我习惯的:
2325
2401
2482
2537
2592
2647
...
Run Code Online (Sandbox Code Playgroud)
每个统计表按行顺序排列.
然后,如果你选择111,它会像这样出现:
5652
5610
5569
5528
5487
5437
5387
5336
...
Run Code Online (Sandbox Code Playgroud)
这怎么可能呢?这都是在pgadmin接口中进行查询.没有额外的where子句,只有我说过的那个,即WHERE athlete_id = 111
什么?我一直在进行各种代码更改,但是在pgaadmin/pgsql中究竟会导致什么?
110和111之间发生了什么?在rails内部进行了大量的重构和代码更改,但没有实际的直接SQL操作.是的我知道答案可能在那里,但我不知道如何看,因为这不是在rails应用程序 - 这是通过pgadmin的纯SQL,所以必须在postgres中完成一些事情 - 我需要了解什么可能是或者我无法调试.
有任何想法吗?在rails中,例如:
Athlete.stats.last.score返回'first'行而不是'last'行,完全搞砸了应用程序,但仅适用于id高于110的运动员!
完全糊涂了!
如果您没有指定ORDER BY子句,则无法保证返回行的顺序.它们可以是升序,降序,没有明显逻辑的顺序,甚至可能是不同的每次查询时都会订购(尽管在实践中不太可能发生).
您获得的具体顺序是由于查询计划中步骤的实现细节.当您更改参数时,它可能导致PostgreSQL更喜欢一个查询计划而不是另一个查询计划.例如,它可能决定对一个查询使用表扫描,而对另一个查询使用索引.在特定情况下很难确切地知道原因,但查看EXPLAIN的结果可能会给出一些提示.
要修复查询以按预期顺序返回行,请添加ORDER BY子句:
SELECT *
FROM stats
WHERE athlete_id = 5
ORDER BY id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |