在SQLServer 2005中需要使用ROW_NUMBER而不带over。

3

可能重复:
在SQL中无需使用OVER的ROW_NUMBER()

我有一个带有每个列排序功能的网格,并且一次只显示50行。

我正在使用sql server 2005作为数据库。

现在,sql server 2005中有ROW_NUMBER函数来过滤带有行号的数据,但必须使用 Over(order by [Column])。在我的情况下,我必须使用不同列对我的网格进行排序,因此无法在order by子句中使用静态列名。限制是,我必须使用静态查询。

你们能否帮助我解决这个问题?


你可能会发现我的答案有用,但是性能不佳。链接 - Martin Smith
1
@MartinSmith。你收到我的问题了吗?我能否在不使用over或动态order by列的情况下使用Row_number。 - Sharad
2个回答

4

在每个列上使用多个ROW_NUMBER子句并选择相关的子句:

....
    ROW_NUMBER() OVER (ORDER BY [Column1]) as rn1,
    ROW_NUMBER() OVER (ORDER BY [Column2]) as rn2,
    ROW_NUMBER() OVER (ORDER BY [Column3]) as rn3,
    ROW_NUMBER() OVER (ORDER BY [Column4]) as rn4
....

或者使用CASE表达式。注意:所有数据类型必须兼容。

ROW_NUMBER() OVER (ORDER BY CASE @sort
                     WHEN 1 THEN [Column1]
                     WHEN 1 THEN [Column2]
                     WHEN 1 THEN [Column3]
                     ...
                   END

或者,如果你真的想要任意行数,则可以这样做:

ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as rn

0

我找到了一些方法来做这件事。

SELECT
  OrderID, CustomerID, EmployeeID, OrderDate, ShippedDate,
  @Offset, @Limit, @SortColumn, @SortDirection
FROM
  Orders
WHERE
  ROW_NUMBER() OVER 
  (
    ORDER BY
      /* same expression as in the ORDER BY of the whole query */
  ) BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize 
  /* AND more conditions ... */
ORDER BY
  CASE WHEN @SortDirection = 'A' THEN
    CASE @SortColumn 
      WHEN 'OrderID'    THEN OrderID
      WHEN 'CustomerID' THEN CustomerID
      /* more... */
    END
  END,
  CASE WHEN @SortDirection = 'D' THEN
    CASE @SortColumn 
      WHEN 'OrderID'    THEN OrderID
      WHEN 'CustomerID' THEN CustomerID
      /* more... */
    END 
  END DESC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接