Как правильно использовать функцию ROW_NUMBER Sql Server с упорядоченными запросами? - PullRequest
2 голосов
/ 07 октября 2011

Я пытаюсь понять ROW_NUMBER из MSSQL и делаю некоторый опыт.

У меня есть два фрагмента:

SELECT * 
    FROM 
    (
        SELECT *,
        ROW_NUMBER() OVER (order by p.DtDistribuicao) AS RowNumber
        FROM ProcessoInstanciaFonte as p
    ) as q 

WHERE q.RowNumber BETWEEN 1 AND 20;

и

select top 20 * from dbo.ProcessoInstanciaFonte as p order by p.DtDistribuicao

Они оба должны возвращать одинаковые строки, но это не так. В чем проблема?

1 Ответ

4 голосов
/ 07 октября 2011

Я думаю, что значения p.DtDistribuicao имеют некоторые связи.Сервер может выбрать любое из связанных значений, так как «первый» и два разных запроса могут дать два разных результата в этом случае.

Вы можете добавить уникальное поле в конце ORDER BYкак разорватьНапример, эти два запроса должны возвращать одинаковые строки (при условии, что у вас есть уникальное поле с именем Id):

SELECT * 
    FROM 
    (
        SELECT *,
        ROW_NUMBER() OVER (ORDER BY p.DtDistribuicao, p.Id) AS RowNumber
        FROM ProcessoInstanciaFonte as p
    ) AS q     
WHERE q.RowNumber BETWEEN 1 AND 20;
ORDER BY q.RowNumber

SELECT TOP 20 *
FROM dbo.ProcessoInstanciaFonte AS p
ORDER BY p.DtDistribuicao, p.Id
...