Запрос sqLite OFFSET не работает с предложением WHERE? - PullRequest
0 голосов
/ 02 марта 2019

Может кто-нибудь объяснить, почему этот запрос sqlite3 будет работать, и вернет мои 1000 записей:

SELECT * FROM fmsdata LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000

но в ту минуту, когда я опускаю предложение where WHERE valve=3, оно ничего не возвращает?

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000

Этот подзапрос возвращает размер таблицы, равный 123290.

SELECT COUNT(*) FROM fmsdata

К вашему сведению, смещение состоит в том, чтобы просто быстро указать мне конец базы данных без необходимости что-либо сортировать, поскольку я знаю, что последние записи всегда будутбыть в конце.

Вот успешный запрос без предложения where:

no where clause

В нашей тестовой таблице записи циклически повторяются102 клапана, поэтому с пределом 1000 у нас должно быть как минимум 9 записей, которые показывались в конце запроса.

Не уверен, что это важно, но я в системе Ubuntu 18.04.

1 Ответ

0 голосов
/ 02 марта 2019

Этот запрос:

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET (SELECT COUNT(*) FROM fmsdata) - 1000

по вашим данным эквивалентен:

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET 123290 - 1000

или

SELECT * FROM fmsdata WHERE valve=3 LIMIT 1000 OFFSET 122290

, и это переводится на:

Из строк, где вентиль = 3, пропустите первые 122290, а затем покажите мне максимум 1000 строк.

У вас есть более 122290 строк, где valve=3?Я так не думаю.Вот почему вы ничего не получаете.Я думаю, что вы действительно хотите это:

SELECT * FROM fmsdata WHERE valve=3 
LIMIT 1000 
OFFSET (SELECT COUNT(*) FROM fmsdata WHERE valve=3) - 1000

Это означает, что если у вас есть 1100 строк, где valve=3, первые 100 (= 1100 - 1000) будут пропущены, а остальные 1000 будут выбраны.Если у вас есть 1000 или меньше строк, где valve=3, то будут выбраны все эти строки. В качестве примечания :когда вы используете LIMIT без ORDER BY, вы должны знать, что результат не гарантированно будет точным.

...