【问题标题】:SQL Server Pagination w/o row_number() or nested subqueries?没有 row_number() 或嵌套子查询的 SQL Server 分页?
【发布时间】: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


【解决方案1】:

不幸的是,虽然SQL Server 2005 Row_Number() 可用于分页,并且SQL Server 2012 data paging 支持通过按偏移量排序和获取下一个得到增强,以防万一您无法使用这些解决方案中的任何一个,您首先需要

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多