项目开发笔记(临时视图)-1
前个星期,在女友的关系介绍下,找到了项目,就是开发一个话单查询子系统,由于是电信级别的东西,数据量自然是大了,日数据量就有500万左右,听了都是吓人的(具体我也不清楚,因为是负责人说的).
项目拿到了,碰到的首要问题就是:如何跨多表查询?
例如:2006-5-1日的数据就存在 F_20050502中
2006-5-2日的数据就存在 F_20050502中
2006-5-3日的数据就存在 F_20050503中
依次类推...
而,用户查询的时候,又需要从多个表中查询数据.例如:查2006-5-1 到 2006-5-10的数据,就要跨10个表.(真的是很麻烦)
经过2天的思索,我想出了以下的方案.用存储过程实现,通过传入 start_time (起始时间) end_time(结束时间),用循环查询先确定表是否存在,然后动态生成一个 select 语句.用 union all 把这些个select语句组合在一起.代码如下:
declare @sd datetime
declare @ed datetime
declare @td datetime
declare @NN int
declare @d int
declare @sql varchar(4000)
declare @T varchar(255)
set @sd=@start_time--CAST('2006-05-01 12:35:29.998' AS datetime)
set @ed=@end_time --CAST('2006-05-03 12:35:29.998' AS datetime)
--set @td=@sd
set @d=datediff(DD,@sd,@ed)
print @d
print @td
set @NN=0
set @sql=' '
DECLARE @FLAG INT
SET @FLAG=0
-- 生成待查询的数据表 集合
while @NN<=@d
begin
set @td=dateadd(DD,@NN,@sd)
set @NN=@NN+1
SET @T=DATEPART(YYYY,@td)
if DATEPART(MM,@td)<10
set @T=@T+'0'+cast(DATEPART(MM,@td) as char(1))
else
set @T=@T+CAST(DATEPART(MM,@td) AS CHAR(2))
if DATEPART(DD,@td)<10
set @T=@T+'0'+cast(DATEPART(DD,@td) as char(1))
else
set @T=@T+CAST(DATEPART(DD,@td) AS CHAR(2))
SET @T='FACT_'+@T
--PRINT @T
if exists (select * from sysobjects where id = object_id(@T) and OBJECTPROPERTY(id, 'IsUserTable') = 1)
BEGIN
--PRINT '-----'
PRINT @T
--PRINT '!----!'
--考虑时间范围 小时/分
IF @FLAG=0
begin
SET @SQL='SELECT '+@fileds+' FROM '+@T+' where start_time>='''+cast(@start_time as varchar(50))+''' and '+@query
SET @FLAG=1
end
ELSE
begin
SET @SQL=@SQL+' UNION ALL SELECT '+@fileds+' FROM '+@T+' where '+@query
end
END
end
到此处,@SQL里,已经是多个表查询的语句了.再在外面套上一个 select 语句就可以查询.
如: @SQL='select * from ('+@SQL+')'就可以了
最后exec(@SQL)就可以返回数据了.
不过,经过实际运用,该方法不太好,生成的sql 语句太长,而且是用不方便.于是我又想出了第2种办法,就是"临时视图",为什么有"临时表"就不能有"临时视图"呢?
采用了该方法后,程序大大简化了.而且使用方便了,至于效率吗(机器效率)应该是低点.
具体思路是:
程序运行时,先确定范围,然后根据范围自动创建一个视图,提供给后续查询用,查询完毕后,用drop把视图删除.
具体如下
while @NN<=@d
begin
set @td=dateadd(DD,@NN,@sd)
set @NN=@NN+1
SET @T=DATEPART(YYYY,@td)
if DATEPART(MM,@td)<10
set @T=@T+'0'+cast(DATEPART(MM,@td) as char(1))
else
set @T=@T+CAST(DATEPART(MM,@td) AS CHAR(2))
if DATEPART(DD,@td)<10
set @T=@T+'0'+cast(DATEPART(DD,@td) as char(1))
else
set @T=@T+CAST(DATEPART(DD,@td) AS CHAR(2))
SET @T='FACT_'+@T
--PRINT @T
if exists (select * from sysobjects where id = object_id(@T) and OBJECTPROPERTY(id, 'IsUserTable') = 1)
BEGIN
set @FLAG=@FLAG+1
IF @FLAG=1
begin
set @sql='select * from '+@T
end
ELSE
begin
set @sql=@sql+' union all select * from '+@t
end
END
end
if @FLAG=0
begin
select 0
return -1
end
--创建一个零时试图
declare @tmpView varchar(4000)
set @tmpView='tmpV'+cast(DATEPART(YYYY,getDate()) as varchar(4))+
cast(DATEPART(MM,getDate()) as varchar(2))+
cast(DATEPART(DD,getDate()) as varchar(2))+
cast(DATEPART(HH,getDate()) as varchar(2))+
cast(DATEPART(SS,getDate()) as varchar(2))+
cast(DATEPART(MS,getDate()) as varchar(4))
set @sql='CREATE VIEW '+@tmpView+ ' as '+@sql
print @sql
exec(@sql)
--临时视图创建完毕
到此视图@tmpView 就创建好了.后面的查询都可以直接引用 @tmpView了.
在查询结束后,只需要在执行下面的语句即可
set @sql='drop view '+@tmpView
exec(@sql)
项目开发笔记(临时视图)-1相关推荐
- [Openwrt 项目开发笔记]:Samba服务vsFTP服务(四)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 在上一节中,我们讲述了如何在路由器上挂载U盘,以 ...
- 京东投票项目开发笔记
京东投票项目开发笔记 打开项目 $yarn install / $ npm install: 跑环境(把项目依赖的插件进行安装) $node admin.js: 启服务(把自己的计算机作为服务器,创建 ...
- 京东抽奖项目开发笔记
京东抽奖项目开发笔记 前言: 这是一个独立项目,这个项目会由我们四个人来一起完成,所以首先就要分工合作,我是写前端的,所以我会先把基本的页面写出来 1.注册页 这是注册页的代码 <!DOCTYP ...
- 尚硅谷前端项目开发笔记
尚硅谷前端项目开发笔记 B站视频直达,这个项目亮点在于所有 API 请求都并非在组件内编写,而是在组件内使用this.$store.dispatch() 派发任务,再由 Vuex(actions.mu ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...
- Vue PC商城项目开发笔记与问题汇总
Vue PC商城项目开发笔记与问题汇总 负责PC端商城项目,这也是人生第一个真正的项目.刚做了一天,就遇到不少问题,在这里列出自己的问题与解决办法,与大家交流,提升自己,希望以后不会掉进同一个坑里. ...
- 天天生鲜项目开发笔记
天天生鲜项目开发笔记 说在前面的话 大学四年,忙忙碌碌,什么都学了,又好像什么都没学,总之要毕业了,毕设题目是"生鲜配送系统",B站上找到了一个天天生鲜的项目开发教程,之后文章记录 ...
- iOS项目开发实战——设置视图的透明度改变动画
在iOS中 ,透明度的改变可以让View视图以一种渐变的效果动态的出现或者消退,非常有意思.这里我们将会对一个View控件的色块执行透明度改变的动画.关于其他的动画效果可以参考我的其他几篇博客< ...
- 微信公众号项目开发笔记 一
最近换了新工作,刚刚开始上班.需要为公司开发一个微信公众号的功能,对接系统erp接口.做一个物流信息手机签收的功能.使用.net MV4 进行项目开发,引用第三方库做微信公众号配置功能.因为之前做过公 ...
最新文章
- Java多线程初学者指南(10):使用Synchronized关键字同步类方法
- 深度学习的一些经验总结和建议| To do v.s Not To Do
- jquery 键盘事件
- iQOO 8系列即将登场:首发三星E5 AMOLED全面屏
- smart模版学习笔记一
- 递归算法1加到100_「算法」北京大学算法基础—递归(1)
- LeetCode刷题系列(三)排序
- 最新xml注释顶格问题的解决方法
- 酒店IPTV数字电视系统解决方案
- Win10系统安装SQL2008 R2详细步骤+图片+常见问题及解决方法
- 20年中国人均GDP排名变化
- taskmgr多开补丁
- 若依框架前端菜单生成,权限标识,路由地址
- iOS开发模拟网络状态差进行调试
- 地铁译:Spark for python developers --- 搭建Spark虚拟环境1
- dz程序上传服务器的位置,dz手机端上传到远程服务器
- 更高的抵押贷款利率对美国房地产市场意味着什么?
- 拿番茄炒鸡蛋来讲解一下大数据项目的流程
- 计算机共享有哪些方式,信息共享的方式有哪些
- 【笨木头Lua专栏】基础补充04:迭代器初探