SQL доступа с помощью TOP 5, возвращая больше чем 5 результатов?

Во-первых, nil не == false, однако, nil оценивается как false. Попробуйте сами, если не верите:

irb(main):001:0> nil == false
=> false
irb(main):002:0> nil == nil
=> true

Какой из вариантов означает:

irb(main):003:0> false.nil?
=> false

Вы можете очистить свой код следующим образом, так как кажется, что @firsttime никогда не устанавливается к истине где угодно.

unless session[:visited]
  session[:visited] = true
  initglobals
end

Наконец, rake tmp: session: clear будет работать только в том случае, если вы используете ActiveRecordStore, если вы используете CookieStore (который используется по умолчанию). Тогда вам нужно будет очистить ваши куки или использовать reset_session.

9
задан Lunatik 20 May 2009 в 14:34
поделиться

2 ответа

Это известный эффект директивы top в Access, но он не очень хорошо известен ...

Директива top не работает. t вернуть верхние n элементов, как легко убедить. Вместо этого он возвращает не менее n отдельных элементов, определяемых порядком результатов.

В большинстве случаев это то же самое, но в вашем примере, где элементы с 5-го по 8-й имеют одинаковое значение порядка, все из они включены. Он возвращает первые пять элементов, а затем также все элементы, которые имеют то же значение порядка, что и пятый элемент.

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

Другие диалекты SQL могут вести себя иначе. Директива top , например, в T-SQL (SQL Server) никогда не возвращает более n элементов. Однако, указав пункты со связями и в порядке вместе с вверху , можно наблюдать то же поведение, что и в Access.

30
ответ дан 4 December 2019 в 07:14
поделиться

Перейдите на страницу с именами справки Access 2003 О режиме запросов ANSI SQL (MDB) , затем разверните «Зачем использовать ANSI-92 SQL?» тема, и вы увидите следующее:

«Использование предложения LIMIT TO nn ROWS для ограничения количества строк, возвращаемых запросом»

Так что просто переведите пользовательский интерфейс Access в режим запроса ANSI-92 или используйте OLE DB ( например, ADO) в коде и добавьте в запрос предложение

LIMIT TO 5 ROWS

.

...

Шучу! Это просто еще один пример того, как ядро ​​базы данных Access плохо документировано. Я думаю, что кто-то из группы документации Access сделал не слишком необоснованное предположение, что так называемый режим запроса ANSI-92 движка базы данных Access будет соответствовать стандарту ISO / ANSI SQL-92. Это не так.

Механизм базы данных Access имеет собственный собственный синтаксис TOP n (т. Е. Не-SQL-92 Standard) (не путать с собственным синтаксисом TOP n сервера SQL, который отличается семантически). Короче говоря, он не устраняет дубликаты. Если критериям удовлетворяет каждая строка в таблице, вы получите каждую строку в таблице в наборе результатов.

Обходной путь - использовать курсор для чтения только первых n строк в наборе результатов. Поскольку SQL базы данных Access не поддерживает процедурный код или явные курсоры, вам необходимо сделать это на стороне клиента, например

1
ответ дан 4 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: