2011-11-16 2 views
4

В нашем запросе мы используем ROW_NUMBER(). Он возвращает правильные результаты практически во всех сценариях. Но для 1 пользователя это ведет себя по-разному.В каких сценариях SQL Server ROW_NUMBER() не начинается с 1?

With #TEST as (
    select top 50 
     ROW_NUMBER() over (order by a.ID) as RN, 
     a.ID ID, a.Name Name 
    FROM a 
    where a.name like '%test%') 
select * 
from #TEST 
where RN BETWEEN 1 AND 50 
order by RN 

Этот запрос работает отлично для этого пользователя, когда размер страницы устанавливается в 50. Но когда размер страницы установлен в 100, то мы заметим, что он не возвращает все строки. Он просто возвращает только 10 строк. Несмотря на то, что существует более 100 результатов, удовлетворяющих условию. Пожалуйста, найдите нижеприведенный запрос, который работает неправильно.

With #TEST as (
    select top 100 
     ROW_NUMBER() over (order by a.ID) as RN, 
     a.ID ID, a.Name Name 
    FROM a 
    where a.name like '%test%') 
select * 
from #TEST 
where RN BETWEEN 1 AND 100 
order by RN 

Когда попытались проверить причину, мы видим, что второй запрос возвращает RN значения больше чем 100. Она не начинается с 1.

Может кто-нибудь объяснить возможную причину такого поведения. Есть ли что-нибудь, что нужно изменить в синтаксисе, или есть ли какой-либо параметр, который нужно изменить в SQL Server для значений функции row_number(), начиная с 1?

+5

Боковой комментарий: Я бы ** НЕ ** вызывал свое CTE какое-то имя, которое начинается с символа '#' - этот символ обозначает ** временные таблицы **, хранящиеся в 'TempDB' .... используйте другое имя –

ответ

9

row_number всегда начинается с одного.

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

Вы делаете select top без заказа по предложению. Это означает, что вы не можете контролировать, какие строки возвращаются. Вероятно, вы получаете разные планы выполнения, которые используют разные индексы для получения строк. Топ-100 строк в одном плане не совпадают с топ-100 в другом плане. Добавьте соответствующий запрос к запросу в CTE или вы можете удалить верхнее предложение, так как вы все равно фильтруете строки в основном запросе.

 Смежные вопросы

  • Нет связанных вопросов^_^