Tôi có truy vấn sau đây trong postgres:Strange đặt hàng lỗi (nó là một lỗi?) Trong postgres khi đặt hàng hai cột với các giá trị giống hệt
SELECT *
FROM "bookings"
WHERE ("bookings".client_id = 50)
ORDER BY session_time DESC
LIMIT 20 OFFSET 0
Các kỷ lục trong vị trí thứ 20 là có session_time giống với Kỷ lục 21.
Truy vấn này trả về 20 kết quả, tuy nhiên nếu bạn so sánh kết quả với toàn bộ cơ sở dữ liệu, truy vấn trả về kết quả thứ 1-19 và số 21, bỏ qua 20.
truy vấn này có thể được cố định bằng cách thêm, "id" trình tự:
SELECT *
FROM "bookings"
WHERE ("bookings".client_id = 50)
ORDER BY session_time DESC, id
LIMIT 20 OFFSET 0
Tuy nhiên tôi đã tự hỏi như thế nào lỗi này xảy ra? Làm thế nào để bưu điện đặt hàng giống hệt nhau nộp khi sử dụng offsets và giới hạn? Là nó ngẫu nhiên? Nó là một lỗi với postgres?
Nếu bạn muốn kết quả xác định, bạn cần bao gồm bộ ngắt kết nối duy nhất theo thứ tự của bạn. Nó giống như không có 'thứ tự bởi' ở tất cả và mong đợi các kết quả được sắp xếp theo một thứ tự cụ thể. Không đảm bảo rằng họ sẽ. –
Những gì bạn đang đề cập đến được gọi là một loại ổn định. Một loại ổn định giữ hồ sơ theo thứ tự ban đầu khi chúng có các khóa khớp. Chắc chắn không có yêu cầu cho một loại ổn định trong SQL. Tôi sẽ không phụ thuộc vào nó trong bất kỳ sản phẩm nào. Như Martin gợi ý, hãy sử dụng cột khác làm bộ ngắt kết nối. –
Điều này chắc chắn nhất là * không * một lỗi - bạn đã yêu cầu nó chỉ được sắp xếp theo 'session_time' và người lập kế hoạch sẽ cung cấp cho bạn kế hoạch nhanh nhất để thực hiện điều đó; nó làm cho không có giả định về những gì * khác * bạn có thể muốn đặt hàng bởi rằng bạn không nhà nước. Chỉ cần cho vui, cập nhật một trong những hàng đó (ngay cả với các giá trị hiện tại) và thực hiện một 'SELECT' mà không có mệnh đề' ORDER BY'. Nếu bạn muốn mọi thứ theo một thứ tự cụ thể, bạn cần xác định điều đó. – kgrittn