关于sql:在命令两个具有相同值的列时postgres中的奇怪的排序错误(这是一个错误吗?)

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,即使我没有限制或偏移问题,以确保查询每次运行时都是相同的)。

如果要进行分页,请将主键或代理键添加到排序中,作为一个断开器。这真是最好的办法。