SQL Server分页没有row_number()或嵌套子查询?

时间:2011-09-26 00:34:17

标签: sql-server pagination limit row-number

整个周末我一直在和这个人打架,而且我没有想法。为了在我的网站上的搜索结果中包含页面,我需要从SQL Server 2005 Express数据库返回行的子集(即从第20行开始,然后给出接下来的20条记录)。在MySQL中,您将使用“LIMIT”关键字来选择要从哪一行开始以及返回多少行。

在SQL Server中,我发现了ROW_NUMBER()/ OVER,但是当我尝试使用它时,它会显示“Over not supported”。我在想这是因为我使用的是SQL Server 2005 Express(免费版)。任何人都可以验证这是否属实,或者是否有其他原因不支持OVER子句?

然后我发现旧的学校版本类似于:

SELECT TOP X * FROM TABLE WHERE ID NOT IN (SELECT TOP Y ID FROM TABLE ORDER BY ID) ORDER BY ID其中X =每页的数量,Y =开始的记录。

但是,我的查询要复杂得多,有很多外连接,有时候会按主表中的内容排序。例如,如果有人选择按用户发布的视频数量进行排序,则查询可能需要如下所示:

SELECT TOP 50 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID WHERE iUserID NOT IN (SELECT TOP 100 iUserID, iVideoCount FROM MyTable LEFT OUTER JOIN (SELECT count(iVideoID) AS iVideoCount, iUserID FROM VideoTable GROUP BY iUserID) as TempVidTable ON MyTable.iUserID = TempVidTable.iUserID ORDER BY iVideoCount) ORDER BY iVideoCount

问题出在子查询 SELECT行:TOP 100 iUserID,iVideoCount

要使用“NOT IN”子句,似乎我只能在子查询中有一列(“SELECT TOP 100 iUserID FROM ...”)。但是当我在子查询SELECT语句中不包含iVideoCount时,子查询中的ORDER BY iVideoCount没有正确排序,因此我的子查询的排序方式与我的父查询不同,这使得整个事情变得毫无用处。还有大约5个表与外连接相关联,可以在排序中起作用。

我不知所措!上面两种方法是我能找到的两种方法让SQL Server返回行的子集。我准备返回整个结果并循环遍历PHP中的每条记录,但只显示我想要的那些。这是一种低效的方式,它确实是我的最后手段。

关于如何在上述场景中使SQL Server模仿MySQL的LIMIT子句的任何想法?

1 个答案:

答案 0 :(得分:0)

不幸的是,尽管可以使用SQL Server 2005 Row_Number()进行分页,并且使用Order By Offset和Fetch Next增强SQL Server 2012 data paging支持,如果你不能使用任何这些解决方案,你需要先

  1. 使用标识列创建临时表。
  2. 然后使用ORDER BY子句将数据插入临时表
  3. 使用临时表标识列值,就像ROW_NUMBER()值
  4. 一样

    我希望它有所帮助,