Oracle分页+付上Sql Server分页+千万级数据分页的存储过程是怎样的

70次阅读
没有评论

共计 3227 个字符,预计需要花费 9 分钟才能阅读完成。

行业资讯    
数据库    
Oracle 分页 + 付上 Sql Server 分页 + 千万级数据分页的存储过程是怎样的

这篇文章给大家介绍 Oracle 分页 + 付上 Sql Server 分页 + 千万级数据分页的存储过程是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

select * from a_matrix_navigation_map
where rowid not in(select rowid from a_matrix_navigation_map where rownum =0) and rownum =10

第二种:

SELECT * FROM
(
SELECT A.*, rownum r
FROM
(
SELECT *
FROM a_matrix_navigation_map

) A
WHERE rownum = 10
) B
WHERE r 0

第三种

SELECT * FROM table WHERE ROWNUM
minus
SELECT * FROM table WHERE ROWNUM
第四种

可以用变通一点的办法,我给个示例:

sql = select a_id,a_title,a_author,aID,a_time,a_readtime,sID from article order by a_id

int a;
while (rs.next()) {
a++;
if (a=ipage+spage)continue;

}
其中第二种是非常成熟的分页
我的实例~ 即可实现 类似 limit 功能 $bandanspager= select * from abc t2,abc1 t1 where t1.id=t2.id group by t1.id
  $sql= SELECT * FROM
  (
  SELECT A.*, rownum r
  FROM
  (.$bandanspager.) A
  WHERE rownum = 10
  ) B

  WHERE r 0

 

 

Oracle 不支持类似于 MySQL 中的 limit. 但你还是可以 rownum 来限制返回的结果集的行数.

如果你只希望返回前十行纪录,你可以这样写:

SELECT * FROM table WHERE ROWNUM

但是下面的语句是不对的:

SELECT * FROM table WHERE ROWNUM 90 AND ROWNUM

这是因为 Oracle 认为这个条件不成立,所以没有返回。
你应该这样写:

SELECT * FROM table WHERE ROWNUM
minus
SELECT * FROM table WHERE ROWNUM

 

其他数据库模拟实现 mysql 的 limit 语法

假如我有个 user 表, 我想查询符合某些条件的第 50 个用户开始的 10 个用户, 且不能使用 id 号 between and 那样查询, 应该怎么写 SQL 语句?

在 mysql 数据库中有 limit,offset 语句可以方便的实现, 那么在 SQL server 中呢?SQL Server 是否支持 limit 和 offset 语句呢?

select top 10 * from
(select top 60 * from [user] order by userid) aa
order by userid desc

oracle, 如果想从表中取出按照某字段排序前 M 到 N 条记录

下面的 ORACLE 语句是最好的:

SQL select ID from
  (
  select ID , rownum as con from
  (
  select ID from TestSort order by ID
  )
  where rownum = 3  /* N 值 */
  )
  where con /*M 值 */
ID
———-
  2
  3

 

 

SqlServer 分页:

一条 SQL 语句搞定 Sql Server 2000 分页

Sql Server 2000 的分页方案大多采用存储过程来完成,存储过程书写比较复杂,在参考了 ITPUB 网站上众多网友的意见后用一条 SQL 语句就可以实现分页功能。SELECT TOP 页大小 *FROMUsersWHERE(ID NOT IN (SELECT TOP (页大小 *(页数 -1)) ID FROM Users ORDER BY ID DESC))ORDER BYID DESC 注:页大小指的是每页显示的条数。黄底部分是需要用程序运算后的一个数字。

千万级数据分页的存储过程:
引用自:Oracle 分页(limit 方式的运用)+ 付上 SqlServer 分页 + 千万级数据分页的存储过程

/*
  经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒,测试语法如下:
 exec GetRecordFromPage news,newsid,10,100000
  news 为 表名, newsid 为关键字段, 使用时请先对 newsid 建立索引。
*/

/*
函数名称: GetRecordFromPage
函数功能: 获取指定页的数据
参数说明: @tblName  包含数据的表名
  @fldName  关键字段名
    @PageSize  每页记录数
  @PageIndex  要获取的页码
    @OrderType  排序类型, 0 – 升序, 1 – 降序
  @strWhere  查询条件 (注意: 不要加 where)

*/
CREATE PROCEDURE GetRecordFromPage
  @tblName  varchar(255), — 表名
  @fldName  varchar(255), — 字段名
  @PageSize  int = 10,  — 页尺寸
  @PageIndex  int = 1,  — 页码
  @OrderType  bit = 0,  — 设置排序类型, 非 0 值则降序
  @strWhere  varchar(2000) = — 查询条件 (注意: 不要加 where)
AS

declare @strSQL  varchar(6000) — 主语句
declare @strTmp  varchar(1000) — 临时变量
declare @strOrder varchar(500)  — 排序类型

if @OrderType != 0
begin
  set @strTmp = (select min
  set @strOrder = order by [+ @fldName +] desc
end
else
begin
  set @strTmp = (select max
  set @strOrder = order by [+ @fldName +] asc
end

set @strSQL = select top + str(@PageSize) + * from [
  + @tblName + ] where [+ @fldName +] + @strTmp + ([
  + @fldName + ]) from (select top + str((@PageIndex-1)*@PageSize) + [
  + @fldName + ] from [+ @tblName +] + @strOrder + ) as tblTmp)
  + @strOrder

if @strWhere !=
  set @strSQL = select top + str(@PageSize) + * from [
  + @tblName + ] where [+ @fldName +] + @strTmp + ([
  + @fldName + ]) from (select top + str((@PageIndex-1)*@PageSize) + [
  + @fldName + ] from [+ @tblName +] where + @strWhere +
  + @strOrder + ) as tblTmp) and + @strWhere + + @strOrder

if @PageIndex = 1
begin
  set @strTmp =
  if @strWhere !=
  set @strTmp = where (+ @strWhere +)

  set @strSQL = select top + str(@PageSize) + * from [
  + @tblName + ] + @strTmp + + @strOrder
end

exec (@strSQL)

GO

关于 Oracle 分页 + 付上 Sql Server 分页 + 千万级数据分页的存储过程是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计3227字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)