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"?
Ответы
Ответ 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 не используется для ограничения порядка.