Подтвердить что ты не робот

PostgreSQL - повторение строк из LIMIT OFFSET

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

Когда я запускаю этот запрос:

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"?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Подробнее о документации PostgreSQL (http://www.postgresql.org/docs/8.3/static/queries-limit.html):

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

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