【问题标题】:Row_Number() Over Order By Computer columnRow_Number() Over Order By Computer 列
【发布时间】:2014-05-08 23:07:17
【问题描述】:

我想在 SQL 查询中进行分页和排序。

这是我的查询

;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查询中实现对记录的排序和分页?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql sql-server-2005


    【解决方案1】:

    只引用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) 
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        两件事。首先,您不能在同一 SELECT 子句中引用其他列,因为所有列都是“并行”有效计算的,因此新创建的值不可用。一种方法是重复 Ian 的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 应用到使用 TOP 选择 10 行的最终 SELECT - 所以您没有得到“应该出现在第 2 页上的 10 行”,而是得到“任何随机 10 行未出现在第 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
        

        但请注意,第二个变体不保证页面内返回结果的顺序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-17
          • 2012-04-13
          • 1970-01-01
          • 2012-09-23
          • 2014-10-23
          • 1970-01-01
          相关资源
          最近更新 更多