2012-08-10 12 views
8

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?

+4

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ẽ. –

+3

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. –

+6

Đ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

Trả lời

8

Đây không phải là lỗi. Giới hạn và bù đắp xảy ra sau khi đặt hàng và không xác định được hàng nào được chọn trong một trường hợp so với một hàng khác. Nói chung, bạn muốn có một bộ ngắt kết nối để đặt hàng của bạn ổn định và xác định (tôi thích sử dụng các bộ ngắt đặc biệt ngay cả khi tôi không có giới hạn hoặc bù đắp các vấn đề để đảm bảo truy vấn giống nhau mỗi khi nó được chạy).

Nếu bạn đang thực hiện phân trang, hãy thêm khóa chính hoặc khóa thay thế vào loại như một bộ ngắt kết nối. Đó thực sự là cách tốt nhất.

Các vấn đề liên quan