2014-03-29 53 views
0

我想在SQL查询中进行分页和排序。Row_Number()Over Order By计算机列

这里是我的查询

;WITH myCTE AS 
(SELECT (FirstName+''+LastName) as [User Name], 
     ROW_NUMBER() OVER (ORDER BY FirstName) as RowID 
     From [MyTable]) 

SELECT TOP 10 * FROM myCTE 
    WHERE RowID > 10*(2-1) 

它工作正常,但现在我想通过计算列[用户名]

所以我改变了这样的查询

来记录进行排序
;WITH myCTE AS 
(SELECT (FirstName+''+LastName) as [User Name], 
     ROW_NUMBER() OVER (ORDER BY [User Name] ASC) as RowID 
     From [MyTable]) 

SELECT TOP 10 * FROM myCTE 
    WHERE RowID > 10*(2-1) 

但它给出了这个错误:

Msg 207, Level 16, State 1, Line 2 
Invalid column name 'User Name'. 

任何人都可以帮助我如何使用ROW_NUMBER()OVER计算列?或者我如何在SQL查询中实现排序和分页记录?

回答

7

只是指实际的表达在order by,而不是别名:

;WITH myCTE AS 
(SELECT (FirstName+''+LastName) as [User Name], 
     ROW_NUMBER() OVER (ORDER BY FirstName+''+LastName ASC) as RowID 
     From [MyTable]) 

SELECT TOP 10 * FROM myCTE 
    WHERE RowID > 10*(2-1) 
0
DECLARE @pageNumber int, 
     @page_Size int, 
     @page_start int 

SET @pageNumber = 1 
SET @page_Size = 10 
SET @page_start = ((@page_Size-1) * @pageNumber) + 1 
Select TOP(@page_Size)<valiables_names>,ROW_NUMBER() [Row_ID] from <table_Name> having Row_ID >= @page_start 
0

两件事情。首先,您不能引用同一条SELECT子句中的其他列,因为所有列都是“并行”有效计算的,因此新创建的值不可用。一种方法是重复表达伊恩的answer显示,另一种方式是引入另一个CTE:

;WITH CombinedNames AS 
(
    SELECT (FirstName+''+LastName) as [User Name] 
    FROM MyTable 
), Numbered as 
(
    SELECT [User Name], 
     ROW_NUMBER() OVER (ORDER BY [User Name]) as RowID 
     From CombinedNames 
) 
SELECT TOP 10 * FROM Numbered 
    WHERE RowID > 10*(2-1) 

但是,这是很重要的,这实际上仍然打破。为什么?因为你没有应用任何ORDER BY到最后的SELECT使用TOP来选择10行 - 所以你没有得到“应该出现在第2页的10行”,你会得到“任何随机的10行' t出现在第1页“。因此,我们需要再作更改:

;WITH CombinedNames AS 
(
    SELECT (FirstName+''+LastName) as [User Name] 
    FROM MyTable 
), Numbered as 
(
    SELECT [User Name], 
     ROW_NUMBER() OVER (ORDER BY [User Name]) as RowID 
     From CombinedNames 
) 
SELECT TOP 10 * FROM Numbered 
    WHERE RowID > 10*(2-1) 
ORDER BY RowID 

或者如果你喜欢:

;WITH CombinedNames AS 
(
    SELECT (FirstName+''+LastName) as [User Name] 
    FROM MyTable 
), Numbered as 
(
    SELECT [User Name], 
     ROW_NUMBER() OVER (ORDER BY [User Name]) as RowID 
     From CombinedNames 
) 
SELECT TOP 10 * FROM Numbered 
    WHERE RowID > 10*(2-1) AND RowID <= 10*2 

但请注意这第二个变体并不能保证在页面中返回结果的顺序。

+0

谢谢你....这就是我想要的 – kombsh

相关问题