PostgreSQL-повторяющиеся строки из предела смещения


Я заметил несколько повторяющихся строк в разбитом на страницы наборе записей.

Когда я выполняю этот запрос:

SELECT "students".* 
FROM "students" 
ORDER BY "students"."status" asc 
LIMIT 3 OFFSET 0

Я получаю:

    | id | name  | status |
    | 1  | foo   | active |
    | 12 | alice | active |
    | 4  | bob   | active |

Следующий запрос:

SELECT "students".* 
FROM "students" 
ORDER BY "students"."status" asc 
LIMIT 3 OFFSET 3

Я получаю:

    | id | name  | status |
    | 1  | foo   | active |
    | 6  | cindy | active |
    | 2  | dylan | active |

Почему "foo" появляется в обоих запросах?

2 20

2 ответа:

Почему "foo" появляется в обоих запросах?

Потому что все возвращаемые строки имеют одинаковое значение для столбца status. В этом случае база данных может возвращать строки в любом порядке, который она хочет.

Если вы хотите воспроизводимый порядок, вам нужно добавить второй столбец к вашему порядку по инструкции, чтобы сделать его последовательным. Например, столбец ID:

SELECT students.* 
FROM students 
ORDER BY students.status asc, 
         students.id asc

Если две строки имеют одинаковое значение для столбца status, они будут отсортированы по идентификатору.

Для получения более подробной информации из документации PostgreSQL (http://www.postgresql.org/docs/8.3/static/queries-limit.html) :

При использовании LIMIT важно: Используйте предложение ORDER BY, которое ограничивает результирующие строки уникальным порядком. в противном случае вы получите непредсказуемое подмножество строк запроса. возможно, вы просите десятого по двадцатый ряды,но десятого по двадцатый в каком порядке? Порядок неизвестен, если только вы указанный порядок.

Оптимизатор запросов учитывает лимит при создании плана запроса, поэтому очень вероятно, что вы получите разные планы (дающие разные порядки строк) в зависимости от того, что вы даете для лимита и смещения. Таким образом, использование различных значений предела/смещения для выбора различных подмножеств результата запроса приведет к несогласованным результатам, если вы не примените предсказуемое упорядочение результатов с помощью ORDER BY. это не ошибка; это неотъемлемое следствие того факта, что SQL не обещает доставить результаты запроса в каком-либо определенном порядке, если только ORDER BY не используется для ограничения порядка.