Выберите подмножество строк, используя Row_Number () - PullRequest
4 голосов
/ 17 февраля 2012
Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo'
from customers
where RowNo between 50 AND 60

Я пытаюсь выбрать подмножество строк от 50 до 60. Проблема в том, что 'RowNo' - неверное имя столбца.

Спасибо

Использование SQL SERVER 2008 R2

Ответы [ 2 ]

11 голосов
/ 17 февраля 2012

Используйте ваш запрос в качестве подзапроса, как показано ниже:

select * from (
    Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as [RowNo]
    from customers
) t
where RowNo between 50 AND 60

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

5 голосов
/ 17 февраля 2012

Вам нужно сделать что-то вроде этого:

;WITH PaginatingData AS
(
    Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo'
    from customers
)
SELECT *
FROM PaginatingData
where RowNo between 50 AND 60

Используйте CTE (Common Table Expression - своего рода «встроенное представление») в качестве «оболочки», чтобы ваш RowNo стал действительным именем столбца.

Как перспектива - с SQL Server 2012 вы сможете написать что-то вроде этого:

SELECT 
    id, name
FROM 
    dbo.customers
ORDER BY
    id
OFFSET 50 ROWS
FETCH NEXT 10 ROWS ONLY

SQL Server 2012 будет иметь эту совместимую с ANSI SQL Standard нотацию для прямой подкачки страниц на основе предложения ORDER BY. См. Этот блог (или множество других) для получения дополнительной информации и большего количества образцов.

...