2011-09-26 69 views
0

我整个周末一直在与这个战斗,并且没有想法。为了在我的网站上在我的搜索结果中包含页面,我需要从SQL Server 2005 Express数据库中返回一部分行(即从第20行开始,然后给我下20条记录)。在MySQL中,您可以使用“LIMIT”关键字来选择要开始的行和返回的行数。没有row_number()或嵌套子查询的SQL Server分页?

在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 

的问题是在子查询选择线路:TOP 100 iUserID,iVideoCount

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

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

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

+0

'ROW_NUMBER()OVER( )'在SQL Server 2005中受支持。必须有其他的东西给出错误。你能用'row_number'显示一个不适合你的查询吗? –

+2

看这里:http://stackoverflow.com/questions/5784072/no-support-for-over-in-ms-sql-server-2005 – Dalex

回答

0

不幸的是,尽管SQL Server 2005 Row_Number()可用于寻呼和与SQL Server 2012 data paging支持与订购增强胶版和获取下,如果你不能使用这些解决方案,您需要先

  1. 的创建一个临时表与身份列。
  2. 然后顺序插入数据到临时表中BY子句
  3. 使用临时表标识列值,就像ROW_NUMBER()值

我希望它能帮助,