我整个周末都在和这个作斗争,没有想法。为了在我的网站上的搜索结果中有页面,我需要从 SQL Server 2005 Express 数据库中返回行的子集(即从第 20 行开始并给我接下来的 20 条记录)。在 MySQL 中,您将使用“LIMIT”关键字来选择从哪一行开始以及返回多少行。
在 SQL Server 中,我找到了 ROW_NUMBER()/OVER,但是当我尝试使用它时,它显示“不支持 Over”。我想这是因为我使用的是 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”子句,我似乎只能在子查询中有 1 列(“SELECT TOP 100 iUserID FROM ...”)。但是,当我在该子查询 SELECT 语句中不包含 iVideoCount 时,子查询中的 ORDER BY iVideoCount 排序不正确,因此我的子查询的排序方式与我的父查询不同,这使得整个事情变得毫无用处。还有大约 5 个表与外部联接链接在一起,它们可以在排序中发挥作用。
我很茫然!以上两种方法是我能找到的唯一两种让 SQL Server 返回行子集的方法。我准备返回整个结果并循环遍历 PHP 中的每条记录,但只显示我想要的记录。这是一种低效的处理方式,它真的是我最后的手段。
关于如何使 SQL Server 在上述场景中模仿 MySQL 的 LIMIT 子句的任何想法?