整个周末我一直在和这个人打架,而且我没有想法。为了在我的网站上的搜索结果中包含页面,我需要从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子句的任何想法?
答案 0 :(得分:0)
不幸的是,尽管可以使用SQL Server 2005 Row_Number()进行分页,并且使用Order By Offset和Fetch Next增强SQL Server 2012 data paging支持,如果你不能使用任何这些解决方案,你需要先
我希望它有所帮助,