分页(Paging) / SQL Server / Oracle

2023-11-04

虽然 DataGrid 控件自己带了一个分页处理机制,但它是将符合查询条件的所有记录读入内存,然后进行分页显示的。随着符合条件的记录数目增多,就会出现运行效率问题,或者至少是资源的利用率下降。

下面的代码示例都以下面的表结构为准:

 

  Articles 表 SQL Server 类型 Oracle 类型
PK Id int (自增) number(9) (插入时在当前最大值上加1)
  Author nvarchar(10) nvarchar2(10)
  Title nvarchar(50) nvarchar2(50)
  PubTime datetime date

SQL Server / Access 等微软产品中,我们通常的自定义分页有两种思路:

一种是以 ASP.NET Forum 为代表的、“临时表”方法:即在存储过程中建立一个临时表,该临时表包含一个序号字段(1,2,3,....)以及表的主键(其他能够唯一确定一行记录的字段也是可以的)字段。存储过程可能如下:(编号 SS1)

CREATE Procedure GetAllArticles_Paged
(
     @PageIndex int,
     @PageSize int,
     @TotalRecords out int,
     @TotalPages out int
)
AS

DECLARE @PageLowerBound int
DECLARE @PageUpperBound int

-- Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

-- Create a temp table to store the select results
CREATE TABLE #tmp
(
     RecNo int IDENTITY (1, 1) NOT NULL,
     ArticleID int
)

INSERT INTO #tmp
     SELECT [ID]
     FROM Articles
     ORDER BY PubTime DESC

SELECT A.*
FROM Articles A (nolock), #tmp T
WHERE A.ID = T.ArticleID AND
     T.RecNo > @PageLowerBound AND
     T.RecNo < @PageUpperBound
ORDER BY T.RecNo

GO

另一种可能更适合程序中“拼凑” SQL 语句:用两次 TOP 命令取得我们所要的分页数据,例如:(编号 SS2)

SELECT * FROM
     (
     SELECT TOP( PageSize) * FROM
     (
          SELECT TOP ( PageSize * PageIndex) *
          FROM Articles
          ORDER BY PubTime DESC
     )
     ORDER BY PubTime ASC
)
ORDER BY PubTime DESC

这个的想法就是“掐头去尾”,还有不少分页的方法,这里就不一一列出了。

对于 Oracle 数据库,有几处不同严重妨碍了上面几个方法的实施,比如,Oracle 不支持 TOP 关键字:不过这个好像并不十分严重,因为它提供了 rownum 这个隐式游标,可以实现与 TOP 类似的功能,如:

SELECT TOP 10 ... FROM WHERE ...

要写成

SELECT ... FROM ... WHERE ... AND rownum <= 10

rownum 是记录序号(1,2,3...),但有一个比较麻烦的事情是:如果 SQL 语句中有 ORDER BY ... 排序的时候,rownum 居然是先“标号”后排序!这样,这个序号如果不加处理是不合乎使用需求的。

至于临时表,Oracle 的临时表和 SQL Server 的有很大不同,我还没搞懂这个东西,就不妄加揣测了。

国内网站中介绍 Oracle 分页的资料很少,我找到了一个国外站点(www.faqts.com)的一篇 FAQ,根据这篇文章的介绍,可以如下分页:(编号 Ora1)

SELECT * FROM
     (
     SELECT A.*, rownum r
     FROM
          (
          SELECT *
          FROM Articles
          ORDER BY PubTime DESC

          ) A
     WHERE rownum <= PageUpperBound
     ) B
WHERE r > PageLowerBound;

其中蓝色部分可以改为任意的、需要的 SQL SELECT 语句,这点倒是挺方便的。

  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分页(Paging) / SQL Server / Oracle 的相关文章

  • 从 javascript 调用 HttpHandler

    我有一个简单的页面 带有通过 JavaScript 调用 HttpHandler 的按钮 HttpHandler 获取大量文件并将它们添加到 zip 文件中 完成工作后 zip 文件将添加到 Response 中 此操作可能需要几分钟时间
  • 数字或货币的字符串格式?

    我需要为每个千给出逗号 所以我用了DataFormatString 0 它运行良好 但当值为0 它正在显示 00 我只想只显示 0 我们怎样才能做到这一点 DataFormatString 0 C0 这将格式化为小数点后 0 位的货币 Da
  • 如何从 ASP.net 网站写入 OutputDebugString?

    我需要从网站上的代码输出一些调试信息 我怎样才能打电话OutputDebugString来自 ASP net 网站 并将其显示给运行 DbgView 的用户 Note 网站不支持System Diagnostics Trace TraceW
  • 将 .MDF SQL Server 数据库与 ASP.NET 结合使用与使用 SQL Server

    我目前正在 ASP NET MVC 中编写一个网站 我的数据库 其中还没有任何数据 只有正确的表 使用 SQL Server 2008 我已将其安装在我的开发计算机上 我使用服务器资源管理器从应用程序连接到数据库 然后使用 LINQ to
  • 仅在页面加载时执行 Javascript,而不是回发 (SharePoint)

    我正在尝试在 SharePoint 网站上的自定义页面上加载页面时执行一些 JavaScript 它使用当前用户填充人员选择器 问题是代码也在回发时执行 这是我不希望的 因为它会重置人员选择器的任何更改 我尝试过使用if IsPostBac
  • W3WP.EXE 使用 100% CPU - 从哪里开始?

    在 IIS6 上运行的 ASP NET Web 应用程序会定期使 CPU 达到 100 在这些事件中 几乎所有的 CPU 使用情况都是由 W3WP 负责的 CPU 在几分钟到一个多小时的任何时间都保持在 100 这是在临时服务器上 此时该站
  • Oracle:如何获取刚刚插入的行的序列号?

    如何获取刚刚插入的行的序列号 插入 返回 declare s2 number begin insert into seqtest2 x values aaa returning seq into s2 dbms output put lin
  • 在 Foreach 或 For 循环中使用 EditorFor (ASP.NET MVC + RAZOR)

    我目前正在实施一个家谱我的 ASP NET MVC 项目中的系统 为了设置家庭成员之间的关系 我需要每行显示两个 ComboBox DropDownList 来定义一个成员与另一个成员之间的关系 首先我将分享我的代码 然后我将解释到目前为止
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 我的机器密钥是自动生成的还是隔离的?

    我正在尝试分享 ASPXAUTHASP NET MVC 4 应用程序 在 IIS 7 5 中 和使用的服务之间的 cookieHttpListener在同一主机上 浏览器正确地向两者呈现 cookie 但我的服务收到System Web H
  • ChannelFactory重用策略

    我一直在读到 ChannelFactory 的创建是昂贵的 除非有技术原因不这样做 否则应该在可能的情况下重用 ChannelFactory 或者通过某种方式缓存它们 或者使用工厂的静态实例 根据您的经验 您发现哪些 ChannelFact
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • 从函数内的 SELECT 返回一个变量

    我正在尝试创建一个返回 varchar 的函数 其中一个字段形成一个选择 即聚合字段 我收到下一个错误 ORA 01422 exact fetch returns more than requested number of rows 我的理
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • ASP.NET MVC ActionFilterAttribute 在模型绑定之前注入值

    我想创建一个自定义操作过滤器属性 该属性在模型绑定期间可访问的 HttpContext 项中添加一个值 我尝试将其添加到 OnActionExecuting 中 但似乎模型绑定是在过滤器之前执行的 你知道我该怎么做吗 也许模型绑定器中有一个
  • 如何从asp net core中的AuthorizationFilter重定向到登录页面?

    当我回来时ForbidResult 它重定向到AccessDenied启动时指定的页面 我想做同样的事情UnauthorizedResult 但重定向到Login page P S 我没有使用标准Authorize控制器中的属性我有自己的
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 为什么 appcmd.exe 解锁配置在 Azure 模拟器上不起作用?

    我最近升级到 Azure 2 1 SDK 现在我的部分功能遇到了问题web config在计算模拟器上运行时处于 Web 角色中 我的web config包含这个
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in

随机推荐

  • ES6中数组新增了哪些扩展?

    一 扩展运算符的应用 ES6通过扩展元素符 好比 rest 参数的逆运算 将一个数组转为用逗号分隔的参数序列 console log 1 2 3 1 2 3 console log 1 2 3 4 5 1 2 3 4 5 document
  • 微信小程序中断请求的处理,中断 wx.request() 请求

    在微信小程序中 向后台发出一个请求A 如果长时间后台不返回相应的数据 前端还处于接受状态 这样会引起一些问题 那么就可以在前端代码中直接中断当前的请求 下面发出一个请求 const task wx request url xxxxxxx m
  • 网页显示服务器拒绝了链接,网页出现服务器拒绝链接

    网页出现服务器拒绝链接 内容精选 换一换 主机管理的云服务器列表中仅显示以下主机的防护状态 在所选区域购买的华为云主机已接入所选区域的非华为云主机在所选区域购买的华为云主机已接入所选区域的非华为云主机若未找到您的主机 请切换到正确的区域后再
  • 西门子S7-200SMART控制步进电机(五)

    目录 一 软硬件组成 二 手动控制步进电机旋转方向和速度 三 命令运动轴转以指定的速度运动到所需的位置 四 CPU掉电重启后保持运动控制的当前位置 前面详细讲述了运动控制向导的配置和运动控制指令的使用方法 接下来要讲的是简单程序的编写和调试
  • 【读一读论文吧】BERT

    沐神论文精读B站地址 https www bilibili com video BV1PL411M7eQ spm id from 333 788 paper https arxiv org pdf 1810 04805 pdf usg AL
  • eclipse中报的错:An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio

    在eclipse中新建一个maven项目 进行相应的设置 忽然就卡死了 再次打开就会报出这样的错误 查了下往上很多的解决的方法都是 找到workspace文件夹下的 metadata文件夹 将其删除掉 然后在讲项目重新导入进去eclipse
  • vue+springboot前后端分离项目部署到windows服务器全部流程

    vue springboot前后端分离项目部署到windows服务器 最近看了若依的前后端分离的vue项目 代码撸了一遍之后想要将服务器和前端打包部署到本地windows中 记录自己的部署 一 后端部署 目录结构 项目工程下的pom文件是整
  • CSS面试题26-30

    26 margin 重叠问题的理解 相关知识点 块级元素的上外边距 margin top 与下外边距 margin bottom 有时会合并为单个外边距 这样的现象称为 margin合 并 产生折叠的必备条件 margin必须是邻接的 而根
  • 程序中如何新增微信商户

    1 需要的信息 1 用于微信支付的公众号appid 2 用于微信支付的公众号appkey 3 商户号 4 APIv3密钥 商户支付密钥 V3版本 5 商户证书公钥 apiclient key pem路径 API证书 商户证书 6 微信支付平
  • java int long越界问题_输出越界问题 和 long long 的两数加法问题

    注意方面一 测试 边界的数值 考虑会不会越界 注意方面二 在使用时注意这一点 如下文 直接相加 和赋值后相加不一样 pay more attention 代码 include long long a 44 long long b 44 lo
  • 如何用ChatGPT写出爆款小红书文案,仅3个步骤,快get起来!

    小红书越来越流行了 很多商家和个人都在上面搞运营推广 想要在这个平台众多的内容和用户中脱颖而出 就需要付出很多的时间和精力 你想知道如何快速写出爆款文案 吸引更多的用户浏览 点赞以及关注吗 我发现一个非常好用而且很简单的方法 轻松写出6w
  • 使用Python快速进行Excel合并

    本文记录工作中常遇到的几种Excel文件合并的情景 实际运到问题可以直接运行程序 输入要合并的文件所在的路径就可以实现自动合并 提升工作效率 情形一 Excel属于同一文件夹下 同一文件夹下多个Excel合并 import pandas a
  • Win7复制文件时出现:“您需要权限来执行操作!”(终极解决方法!)

    最近 装了win7需要倒数据 但总是出现 您需要权限来执行操作 提示 而使复制终断 很挠头 后来 发现 原来是 杀毒软件 惹的祸 做程序的朋友请注意 程序复制程序时关闭杀毒软件的2个理由 1 真不知道现在的 杀毒软件 怎么做的 一点水平也没
  • sudo权限

    1 概念 sudo权限就是root把本来只能超级用户执行的命令赋予普通用户执行 sudo的操作对象是系统命令 2 visudo 我们使用visudo来设置sudo 实际上修改的就是 etc sudoers这个文件 3 如何设置sudo权限
  • sh脚本-常用命令

    文章目录 最近碰到的命令 1 curl密令 一 基础命令 Unix命令 1 运行sh脚本命令 2 echo命令 3 exit命令 4 sed命令 5 cut命令 6 awk命令 7 ls命令 8 cat命令 其它命令 二 变量 正则表达式
  • 原子指标,派生指标,衍生指标概念

    指标体系相关概念 1 原子指标 原子指标指的是基于业务过程的度量值 顾名思义是不可以在进行拆分的指标 核心功能 对指标的聚合逻辑进行了定义 三要素 业务过程 度量值 聚合逻辑 2 派生指标 派生指标是基于原子指标的 关系为 派生指标 原子指
  • Docker 常见镜像问题

    Docker 常见镜像问题 Docker 轻松学习 文章目录 Docker 常见镜像问题 一 Docker 是什么 二 如何批量清理临时镜像文件 三 如何查看镜像支持的环境变量 四 docker pull失败 报错提示Error image
  • Elasticsearch—生产环境集群核心配置

    https segmentfault com a 1190000019900040 utm source tag newest
  • C++模板类内友元(友元类,友元函数)声明的三种情况

    根据 C Primer 第三版16 4节的叙述 C 类模板友元分为以下几种情况 1 非模板友元类或友元函数 书上给了一个例子 class Foo void bar template
  • 分页(Paging) / SQL Server / Oracle

    分页 Paging SQL Server Oracle 虽然 DataGrid 控件自己带了一个分页处理机制 但它是将符合查询条件的所有记录读入内存 然后进行分页显示的 随着符合条件的记录数目增多 就会出现运行效率问题 或者至少是资源的利用