免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: iim_liyongfeng

版本12.5.2,分页取数据的sql怎么写?谁能帮我 [复制链接]

论坛徽章:
0
发表于 2007-11-22 11:10 |显示全部楼层
存储过程应该如何调用啊?搞了半天不知道如何使用,郁闷!谢谢了

论坛徽章:
0
发表于 2008-02-21 20:32 |显示全部楼层
创建表的时候设置一个identity的栏位
这样就可以做到分页取数据了

论坛徽章:
0
发表于 2008-02-26 20:41 |显示全部楼层
同意17楼的观点,用游标更好一些。
用临时表算法的空间复杂度是O(n),如果表很大或没有预存在Cache中,所用的I/O时间就非常可观了。
用游标定位到指定的页,空间复杂度应该是O(1),虽然游标遍历记录比直接用Select稍慢一点,但考虑到分页应用中,每次只读取一页的内容,所以这个时间性能上的损失可以忽略。

论坛徽章:
0
发表于 2011-11-18 13:59 |显示全部楼层
虽然这个帖子已经很久了,但是小弟现在遇到个关于sybase临时表分页的问题,对于两个结果集union 后分页不正确。
例如:
SELECT row_num=identity(16),tmpData.* into #tmptalbe from
(
SELECT ACCOUNT_ID ,CARD_ID FROM T_ACCOUNT_CARD
UNION ALL
SELECT USER_ID,ROLE_ID FROM T_USER_ROLE
) tmpData
select * from #tmptalbe
--where row_num>=convert(int,1) and row_num<=convert(int,20)
drop table #tmptalbe


这样分页后不正确,因为union all 后面第二个结果集没有被分配row_num,始终是0,导致我分页不正确。

我尝试改写union all写法, 用full join 来实现,但是测试时才发现sybase居然不支持full join,郁闷到了。。
SELECT
        CASE WHEN A.ACCOUNT_ID IS NULL THEN B.USER_ID ELSE A.ACCOUNT_ID END ID1,
        CASE WHEN A.CARD_ID IS NULL THEN B.ROLE_ID ELSE A.CARD_ID END ID2
FROM T_ACCOUNT_CARD A FULL JOIN T_USER_ROLE B ON 1=2

另外我也测试了用视图来做,结果也不行,视图中用UNION ALL 连接的两个结果集,第二个结果集还是没有ROW_NUM,始终为0,导致sybase临时表分页也不正确。

CREATE VIEW V_TEST  AS(
        SELECT ACCOUNT_ID ,CARD_ID FROM T_ACCOUNT_CARD
        UNION ALL
        SELECT USER_ID,ROLE_ID FROM T_USER_ROLE
)


SELECT row_num=identity(16),tmpData.* into #tmptalbe from
(
SELECT * FROM V_TEST
) tmpData
select * from #tmptalbe
--where row_num>=convert(int,1) and row_num<=convert(int,20)
drop table #tmptalbe


请问怎么来结果这个分页查询不正确,到底union all 后的第二个结果集为什么row_num始终是0,而不是递增的顺序值呢?

论坛徽章:
0
发表于 2012-10-27 17:26 |显示全部楼层
一楼的位置好啊..

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2012-10-28 14:00 |显示全部楼层
本帖最后由 Eisen 于 2012-10-28 14:00 编辑
gelyon 发表于 2011-11-18 13:59
虽然这个帖子已经很久了,但是小弟现在遇到个关于sybase临时表分页的问题,对于两个结果集union 后分页不正 ...

那换个写法呢--
create table #tmptable (row_num int identity,account_id varchar( 8 ),card_id varchar(20))
go
insert #tmptable
SELECT ACCOUNT_ID ,CARD_ID FROM T_ACCOUNT_CARD
UNION ALL
SELECT USER_ID,ROLE_ID FROM T_USER_ROLE

select * from #tmptable  where row_num>=convert(int,1) and row_num<=convert(int,20)

论坛徽章:
0
发表于 2012-10-30 00:14 |显示全部楼层
我n年前写过一个通用的分页程序,见下面链接。
http://bbs.chinaunix.net/forum.p ... p;page=1#pid3779459

用tempdb作为staging area,一定注意别把tempdb填满了。Temp table 最好建索引,插入temp table的语句一定要用index scan,否则会在tempdb中hold transaction而引起tempdb space issue。

论坛徽章:
4
2015年亚洲杯之巴勒斯坦
日期:2015-04-09 11:23:192015年亚洲杯之约旦
日期:2015-04-10 12:08:322015年亚洲杯之科威特
日期:2015-04-10 12:23:222015亚冠之首尔
日期:2015-07-07 16:11:03
发表于 2012-10-30 09:03 |显示全部楼层
楼主,用BCP可以设置起始
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP