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

时间:2012-08-10 15:26:37

标签: sql postgresql sql-order-by limit offset

我在postgres中有以下查询:

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”来修复此查询:

SELECT * 
FROM "bookings" 
WHERE ("bookings".client_id = 50) 
ORDER BY session_time DESC, id 
LIMIT 20 OFFSET 0

但是我想知道这个bug是怎么发生的?在使用抵消和限额时,postgres如何订购相同的字段?是随机的吗?这是postgres的错误吗?

1 个答案:

答案 0 :(得分:9)

这不是错误。排序后发生限制和偏移,并且在一种情况下选择哪一行与另一种情况不确定。一般来说,你想要一个决胜局,以便你的订购稳定和确定(我更喜欢使用独特的tiebreakers,即使我没有限制或偏移问题,以确保每次运行时查询是相同的)。

如果您正在进行分页,请将主键或代理键添加到排序中作为决胜局。这真是最好的方式。