Max分页、With as内存表 存储过程

没办法,这个高亮貌似无法识别SQL语句。

 

在做的过程中因为有些地方需要处理之前得到的一个临时表,但是如果保存在临时表中的话会导致额外的空间消耗,而且我们这种大数据量如果过多的IO操作会让速度变的很慢,所以放弃了临时表,而使用了With As创建表。

语法是:With 表名(表中各种新旧列) AS ( select语句得到的表 )

具体的可以参考http://jeemiss.javaeye.com/blog/642519

由存储过程中可以看出,可以在一个with语句中创建多个内存表(暂时这么叫吧),而且后面的内存表可以使用前面的表,不过有一定的约束条件,比如中间要用逗号隔开、select语句不能出现Order By、with语句之后只有第一个select语句可以使用上面定义的临时表等等。

 

分页算法用的是Max算法,没有用Not IN的原因是效果不好。参见http://blog.sina.com.cn/s/blog_53a185ad010000z8.html

Max算法在做的时候也出现很多问题,比如我在内存表中查处来新表后,每一列都有很多的重复行出现,因为在Union连接的时候用了All,所以过多的重复行无法成功的获得Top或者Max,,苦啊。。

不过后来实验室的一个师弟搞到了一个方法,就是用Group by语句把某两列合并成一列来作为排序列

比如Group By A+B,这样连接A列和B列,就可以获得一个唯一的列C

但是这样操作我总感觉不是太爽,因为合并后毕竟还需要自己处理分解开。

 

顺便说下Group by的威力吧。So牛B。Group by可以把指定的列汇总成一行,并可以用聚合函数进行合并统计

 

select A+B as C from xx Group by A+B

select  A as D,Count(*)As sum From xx Group by A

-- -- -- -- --

A   B C D sum

1 11 111 1 1

2 22 222 2 2

2 33 233

 

具体可以参考http://blog.csdn.net/vividboy/archive/2008/04/21/2313023.aspx

 

后来我就寻思啊,这如果能自己生成一列,然后自动添加序列多好,从1/2/3/4..这样。然后我就找啊找啊,,就遇见了Row_Number()这个牛逼的函数,我了个去啊...。正合适么这不是,函数就是给你添加一列,然后用1起始的数字填充并自加1。

select Row_Number() over (Order by xx) As ID, AA, BB from table

这样以后,就从你select语句原来只有AA,BB两列的前面添加了一列ID,从1开始自加,,多好!你说好不好?这样以后,就可以为所欲为了,不管你前面table被整的多乱,我这边一下给你捋直了~站好!。当然,这个table可以是你前面定义的内存表,然后你再把这个有序号的新查询结果with成一个内存表,这样一来,后面爱做啥你就做啥吧,尽情的分页好了,有这么一个免费的ID列作为主键也好,Order by也兆,成功也就是一会儿的事。

在分页的时候,注意ID>xxx那里,xxx里的查询结果必须加一个AS T,这样才能和ID进行比较,不然不行的..。

 

恩分页暂时就这样,第一个相对大点的存储过程出炉,哎就是记录一下...顺便收集下技术文档。 共勉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值