В каких случаях SQL Server ROW_NUMBER () не начинается с 1? - PullRequest
4 голосов
/ 16 ноября 2011

Мы используем 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 

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

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

1 Ответ

11 голосов
/ 16 ноября 2011

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

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

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

...