2012-02-17 3 views
3
Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo' 
from customers 
where RowNo between 50 AND 60 

Я пытаюсь выбрать подмножество строк от 50 до 60. Проблема заключается в том, что «RowNo» является недопустимым именем столбца.Выберите подмножество строк, используя Row_Number()

Спасибо

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

+4

Пожалуйста, не используйте '' строковые разделители'' для псевдонимов. Этот синтаксис нестандартен, может быть очень запутанным (например, 'SELECT 'a' 'b'') и устарел в SQL Server. Используйте '[квадратные скобки]' (также не стандартные) или '' двойные кавычки '' (стандартные) или без разделителей. Для получения дополнительной информации и много дебатов см. Http://sqlblog.com/blogs/aaron_bertrand/archive/2012/01/23/bad-habits-to-kick-using-as-instead-of-for-column-aliases. aspx –

+0

PS дискуссия о том, что вы * должны использовать. Существует мало аргументов в пользу использования одинарных кавычек *. –

+0

@Aaron: thnx, я не был уверен, что это было устарело или не разрешено в последней версии. –

ответ

10

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

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

Вы можете использовать CTE как хорошо, но нужно ли выбрать один над другим прочитать Difference between CTE and SubQuery? и проверить выполнение плана.

+0

спасибо! Я не знаю, почему вам нужно выполнить такой сложный запрос, когда в mysql вы просто используете LIMIT 49, 10! не могли бы вы рассказать мне, почему нам пришлось писать «t»? – test

+2

@test: поскольку SQL-сервер не имеет 'LIMIT x OFFSET y', как это делает MySQL. Он имеет только «TOP n», который совпадает с MySQL «LIMIT n». –

+2

Но с аналитическими функциями, которые он имеет, такими как «ROWN_NUMBER()» и другими, вы можете делать гораздо более сложные вещи (что очень сложно сделать в MySQL). –

5

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

;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 Таблица 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 пункт. See this blog post (или тонны других) для получения дополнительной информации и более образцов.

+0

'AS RowNo' не нуждается в котировках:' 'RowNo'', не так ли? –

+0

@ypercube Это не так, но это тоже не так. Это просто менее распространенный синтаксис, который можно увидеть с помощью T-SQL. – Yuck

+0

@ypercube: Я не думаю, что это абсолютно необходимо - я просто оставил его, поскольку OP опубликовал его. Лично я бы использовал примечание 'RowNo = ROW_NUMBER() .....', но это только персональный стиль –

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