奇怪的postgres SELECT订购问题

时间:2011-12-14 22:39:33

标签: sql ruby-on-rails postgresql select

我有这个postgres sql查询:

select * from stats where athlete_id = 5

如你所想,这将返回每位身份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和110之间发生了什么111?在rails内部进行了大量的重构和代码更改,但没有实际的直接SQL操作。是的我知道答案可能在那里,但我不知道如何看,因为这不是在rails应用程序 - 这是通过pgadmin的纯SQL,所以必须在postgres中完成一些事情 - 我需要了解什么可能是或者我无法调试。

有什么想法吗?在rails中,例如:

Athlete.stats.last.score返回'first'行而不是'last'行,完全搞砸了应用程序,但仅适用于id高于110的运动员!

完全糊涂了!

2 个答案:

答案 0 :(得分:6)

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

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

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

SELECT *
FROM stats
WHERE athlete_id = 5
ORDER BY id

答案 1 :(得分:2)

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