Strange ordering bug (is it a bug?) in postgres when ordering two columns with identical values
我在Postgres中有以下查询:
1 2 3 4 5 | SELECT * FROM"bookings" WHERE ("bookings".client_id = 50) ORDER BY session_time DESC LIMIT 20 OFFSET 0 |
排名第20的记录与第21个记录的时间相同。
此查询返回20个结果,但是如果将结果与整个数据库进行比较,则查询返回第1-19个结果和第21个结果,跳过第20个结果。
可以通过向订单添加"id"来修复此查询:
1 2 3 4 5 | SELECT * FROM"bookings" WHERE ("bookings".client_id = 50) ORDER BY session_time DESC, id LIMIT 20 OFFSET 0 |
但是我想知道这个错误是怎么发生的?使用偏移和限制时,Postgres如何排序相同的字段?它是随机的吗?这是Postgres的bug吗?
这不是错误。限制和偏移发生在排序之后,并且在一种情况下选择的行与另一种情况下选择的行不确定。一般来说,您希望有一个tiebreaker,以便您的顺序是稳定的和确定性的(我更喜欢使用唯一的tiebreaker,即使我没有限制或偏移问题,以确保查询每次运行时都是相同的)。
如果要进行分页,请将主键或代理键添加到排序中,作为一个断开器。这真是最好的办法。