没办法,这个高亮貌似无法识别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进行比较,不然不行的..。
恩分页暂时就这样,第一个相对大点的存储过程出炉,哎就是记录一下...顺便收集下技术文档。 共勉。