使用SQL语句根据页数计算页号

独木成林_ 2019-08-12 04:17:48
如圖所示,感謝各位指點。
...全文
189 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2019-08-12
  • 打赏
  • 举报
回复
引用 4 楼 独木成林_ 的回复:
[quote=引用 3 楼 二月十六 的回复:] 结贴了,回复的时候记得点击引用,要不我就看不到了…… 相互探讨一下,我说的也不一定对 原理是利用cte公共表达式,来递归处理,具体公共表达式是啥,你可以搜索一下,很多资料。 说递归,cte里边先写第一个语句,读取出来第一条数据
Select *,1 AS PAGE_NO from #T WHERE item_no=1
然后union all 下边是递归的关键,读取上一条的下一条数据,理解一下,就是读取item_no=1 的下一条数据,利用连续自增的item_no来处理,原表数据关联上一条已经读取的item_no=1的数据,取item_no=1数据+1的一条数据,不就是item_no=2的数据了么,下边就开始这个递归处理了item_no=3、item_no=4......
如果拋開CTE表達式,還有其他方式嗎?[/quote] 游标也可以
独木成林_ 2019-08-12
  • 打赏
  • 举报
回复
引用 3 楼 二月十六 的回复:
结贴了,回复的时候记得点击引用,要不我就看不到了…… 相互探讨一下,我说的也不一定对 原理是利用cte公共表达式,来递归处理,具体公共表达式是啥,你可以搜索一下,很多资料。 说递归,cte里边先写第一个语句,读取出来第一条数据
Select *,1 AS PAGE_NO from #T WHERE item_no=1
然后union all 下边是递归的关键,读取上一条的下一条数据,理解一下,就是读取item_no=1 的下一条数据,利用连续自增的item_no来处理,原表数据关联上一条已经读取的item_no=1的数据,取item_no=1数据+1的一条数据,不就是item_no=2的数据了么,下边就开始这个递归处理了item_no=3、item_no=4......
如果拋開CTE表達式,還有其他方式嗎?
二月十六 2019-08-12
  • 打赏
  • 举报
回复
结贴了,回复的时候记得点击引用,要不我就看不到了…… 相互探讨一下,我说的也不一定对 原理是利用cte公共表达式,来递归处理,具体公共表达式是啥,你可以搜索一下,很多资料。 说递归,cte里边先写第一个语句,读取出来第一条数据
Select *,1 AS PAGE_NO from #T WHERE item_no=1
然后union all 下边是递归的关键,读取上一条的下一条数据,理解一下,就是读取item_no=1 的下一条数据,利用连续自增的item_no来处理,原表数据关联上一条已经读取的item_no=1的数据,取item_no=1数据+1的一条数据,不就是item_no=2的数据了么,下边就开始这个递归处理了item_no=3、item_no=4......
独木成林_ 2019-08-12
  • 打赏
  • 举报
回复
引用 1 楼 二月十六 的回复:
我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte

哥,有時間講講原理嗎,從來沒這麼寫過。
二月十六 2019-08-12
  • 打赏
  • 举报
回复
我的写法主要的知识点就是递归循环处理,我简单写一下,特殊情况不多考虑了(默认itemno是主键连续自增的,如果不是就自己再加一个rownum,然后最后一行165的没处理,处理的话,获取表中最大item,这行的pageno=pageno+'-'(pageno+amountofparger))

--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([item_no] int,[AMOUNT_OF_PAGED] int)
Insert #T
select 1,81 union all
select 2,5 union all
select 3,5 union all
select 4,8 union all
select 5,11 union all
select 6,18 union all
select 7,1 union all
select 8,24 union all
select 9,11 union all
select 10,14
Go
--测试数据结束
;WITH cte AS (
Select *,1 AS PAGE_NO from #T WHERE item_no=1
UNION ALL
SELECT #T.*,cte.PAGE_NO+cte.AMOUNT_OF_PAGED FROM #T JOIN cte ON cte.item_no+1 = #T.item_no
)
SELECT * FROM cte



<%-- 作者:何志强[hhzqq@21cn.com] 日期:2000-08-03 版本:1.0 功能:JSP数据库操作例程 - 数据分显示 - JDBC 2.0 - Oracle --%> <%@ page contentType="text/html;charset=8859_1" %> <% //变量声明 java.sql.Connection sqlCon; //数据库连接对象 java.sql.Statement sqlStmt; //SQL语句对象 java.sql.ResultSet sqlRst; //结果集对象 java.lang.String strCon; //数据库连接字符串 java.lang.String strSQL; //SQL语句 int intPageSize; //一显示的记录数 int intRowCount; //记录总数 int intPageCount; //总 int intPage; //待显示码 java.lang.String strPage; int i; //设置一显示的记录数 intPageSize = 2; //取得待显示码 strPage = request.getParameter("page"); if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一据 intPage = 1; } else{//将字符串转换成整型 intPage = java.lang.Integer.parseInt(strPage); if(intPage<1) intPage = 1; } //装载JDBC驱动程序 java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); //设置数据库连接字符串 strCon = "jdbc:oracle:thin:@linux:1521:ora4cweb"; //连接数据库 sqlCon = java.sql.DriverManager.getConnection(strCon,"hzq","hzq"); //创建一个可以滚动的只读的SQL语句对象 sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY); //准备SQL语句 strSQL = "select name,age from test"; //执行SQL语句并获取结果集 sqlRst = sqlStmt.executeQuery(strSQL); //获取记录总数 sqlRst.last(); intRowCount = sqlRst.getRow(); //记算总 intPageCount = (intRowCount+intPageSize-1) / intPageSize; //调整待显示的码 if(intPage>intPageCount) intPage = intPageCount; %> JSP数据库操作例程 - 数据分<em>页</em>显示 - JDBC 2.0 - Oracle <% if(intPageCount>0){ //将记录指针定位到待显示的第一条记录上 sqlRst.absolute((intPage-1) * intPageSize + 1); //显示数据 i = 0; while(i <% sqlRst.next(); i++; } } %>
姓名 年龄
<%=sqlRst.getString(1)%> <%=sqlRst.getString(2)%>
第<%=intPage%> 共<%=intPageCount%> <%if(intPage
下一<%}%> <%if(intPage>1){%>上一<%}%> <% //关闭结果集 sqlRst.close(); //关闭SQL语句对象 sqlStmt.close(); //关闭数据库 sqlCon.close(); %>

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧