免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8303 | 回复: 17
打印 上一主题 下一主题

在Informix IDS 10中如何实现分页查询 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-16 18:16 |只看该作者 |倒序浏览
如题,请教有经验的XDJM们,在数据库层面有没有比较好的解决方案。
Informix IDS 10是否支持分页查询语句?

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2008-01-17 09:19 |只看该作者
...........
这种还是在程序上实现吧.........

论坛徽章:
0
3 [报告]
发表于 2008-01-17 11:24 |只看该作者
在程序中实现效率太低了。期待中...

论坛徽章:
0
4 [报告]
发表于 2008-01-17 11:26 |只看该作者

回复 #1 wingofwind 的帖子

我的解决方案是通过EC程序实现的:
分页记录中页数PAGENUM每页记录数PAGECRDNUM通过参数读入
根据查询条件组织动态查询语句
如果是首次查询
SELECT FIRST PAGECRDNUM COL1,COL2,...,COLn,rowid FROM table WHERE QUERY FILTER ORDER BY ORDER CONDITION,rowid
将选取出的min rowid,max rowid记录下来
下翻一页只需要在QUERY FILTER中加入rowid > max rowid
上翻一页只需要在QUERY FILTER中加入rowid < max rowid
由于FIRST语句不支持子查询,如果要实现跳页查询,需要使用临时表先取得其前一页的最后一条记录的rowid
欲查询第PAGENUM页
SELECT FIRST (PAGENUM - 1)*PAGECRDNUM rowid FROM table WHERE QUERY FILTER ORDER BY ORDER CONDITION,rowid INTO temp tablerowid;

SELECT max(rowid) into :Thresholdrowid FROM tablerowid;

SELECT FIRST PAGECRDNUM COL1,COL2,...,COLn,rowid FROM table WHERE QUERY FILTER AND rowid > Thresholdrowid ORDER BY ORDER CONDITION,rowid

按照这个原理使用SPL效率应该能更好些

呵呵,权当抛砖引玉,希望大家有更好的方法及时提出来共同提高

[ 本帖最后由 wingofwind 于 2008-1-17 11:28 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-01-17 12:53 |只看该作者
不错,受用。多谢楼上

论坛徽章:
0
6 [报告]
发表于 2008-01-18 09:29 |只看该作者

回复 #4 wingofwind 的帖子

SELECT FIRST (PAGENUM - 1)*PAGECRDNUM rowid FROM table WHERE QUERY FILTER ORDER BY ORDER CONDITION,rowid INTO temp tablerowid;
这个语句是编译不过的啊。不能将first n 的记录插入到临表中。

论坛徽章:
0
7 [报告]
发表于 2008-01-18 09:33 |只看该作者
看来只能通过程序来保存max rowid和min rowid

论坛徽章:
0
8 [报告]
发表于 2008-01-18 10:36 |只看该作者

回复 #6 xuanyuan000000 的帖子

SELECT FIRST (PAGENUM - 1)*PAGECRDNUM rowid FROM table WHERE QUERY FILTER ORDER BY ORDER CONDITION,rowid INTO temp tablerowid;
这条语句不是在编译时就确定的,而是在运行时根据取得的PAGENUM 和PAGECRDNUM 参数组成的动态语句,经过PREPARE后再EXECUTE的

论坛徽章:
0
9 [报告]
发表于 2008-01-18 13:39 |只看该作者

回复 #8 wingofwind 的帖子

我就是执行SELECT 10 rowid FROM table WHERE QUERY FILTER ORDER BY ORDER CONDITION,rowid INTO temp tablerowid;都编译不过。不知道是否版本的问题,我的是9.40

论坛徽章:
0
10 [报告]
发表于 2008-01-18 14:21 |只看该作者

回复 #9 xuanyuan000000 的帖子

你把你的数据库版本和CSDK版本贴出来看看
我的IDS是IBM Informix Dynamic Server Version 10.00.UC4
CSDK是IBM Informix CSDK Version 2.90, IBM Informix-ESQL Version 2.90.UC4
经测试没有问题
你可以先在dbaccess试试能不能将选取的rowid记录装入临时表,如果可以表明数据库本身支持这种用法,问题可能出在ESQL上,替换一个高版本的CSDK应该就能解决问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP