簡體   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