【发布时间】:2015-09-07 17:20:47
【问题描述】:
我整个周末都在与这个问题作斗争,但我没有想法。为了在我的网站上的搜索结果中有页面,我需要从 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 子句有什么想法吗?
【问题讨论】:
-
row_number() over()在 SQL Server 2005 中受支持。必须有其他原因导致错误。你能用row_number显示一个不适合你的查询吗?
标签: sql-server pagination limit row-number