[英]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.