数据库中如何写视图,以及视图项目中实际应用
2015-03-03 21:52
579 查看
最近遇到一个需求需要查出3个表的数据,并且有两个表不能连表查询,他们有各自的筛选条件,写出的sql语句如下:
现在我们可以这样做,写一个视图,把这3个表所有的数据用一个视图查出来,放在一个虚拟的表中,然后再在这个虚拟的表上加筛选条件即可,这了样让语句变的灵活,且达到视图的复用,并且更易阅读.
create or replace view v_system_user as
select
'c' || e.base_dep_code||'_'||e.no as id,
e.base_dep_code||'_'||e.no as username,
e.name,
'' password,
'c' as type,
'客户' as type_name,
input_code,
e.sex gender,
(select name from base_dep bd where bd.code = e.base_dep_code) base_dep_name,
e.base_dep_code,
'' state,
telephone,
e.email,
mobile,
qq,
'' receive_sms,
'' receive_sms_start_time,
'' receive_sms_end_time,
'' question,
'' answer
from erp_customer e
union all
select
'w' || ee.id as id,
ee.id username,
ee.name,
'' password,
'w' as type,
'员工' as type_name,
input_code,
ee.sex gender,
(select name from base_dep bd where bd.code = ee.base_dep_code) base_dep_name,
ee.base_dep_code,
'' state,
telephone,
ee.email,
mobile,
qq,
'' receive_sms,
'' receive_sms_start_time,
'' receive_sms_end_time,
'' question,
'' answer
from erp_employee ee;
这个视图查出来的数据是包括这几个表联合后的所有信息,这样如果在这个试图基础上去加筛选条件就会使得查询数据变得十分的简单.
在写代码的时候就可以把数据库变成试图这样代码更加清晰且容易阅读,并且也十分规范.
private static final String TABLENAME = "V_SYSTEM_USER";申明视图
StringBuffer sql = new StringBuffer();
sql.append(" select * from " + TABLENAME + " t where 1=1 " );
if(!CommonFun.isNe(filter)){
sql.append(" and Upper(id||username||name||type_name||base_dep_code||email||input_code) like :filter");
}
params.put("filter", "%" + filter.toUpperCase() + "%");
在编程行业中,复用真的应该无处不在,特别是面向对象语言中,一定要养成这种习惯.
select 'c' || ec.base_dep_code || '_' || ec.no id, ec.base_dep_code || '_' || ec.no username, ec.name, 'c' usertype, bd.input_code base_dep_name, ec.no from ERP_CUSTOMER ec left join base_dep bd on bd.code = ec.base_dep_code where 1 = 1 and Upper(ec.name || ec.base_dep_code || ec.no || ec.input_code) like '%CP%' union all select ee.id ID, ee.name as username, ee.name as Name, ee.Input_Code usertype, bd.short_name base_dep_name, ee.id as NO from ERP_EMPLOYEE ee left join base_dep bd on bd.code = ee.base_dep_code where 1 = 1 and Upper(ee.name || ee.input_code || ee.email) like "cp" '%CP%'这样写很不灵活,遇到筛选条件一变就无法继续使用了,
现在我们可以这样做,写一个视图,把这3个表所有的数据用一个视图查出来,放在一个虚拟的表中,然后再在这个虚拟的表上加筛选条件即可,这了样让语句变的灵活,且达到视图的复用,并且更易阅读.
create or replace view v_system_user as
select
'c' || e.base_dep_code||'_'||e.no as id,
e.base_dep_code||'_'||e.no as username,
e.name,
'' password,
'c' as type,
'客户' as type_name,
input_code,
e.sex gender,
(select name from base_dep bd where bd.code = e.base_dep_code) base_dep_name,
e.base_dep_code,
'' state,
telephone,
e.email,
mobile,
qq,
'' receive_sms,
'' receive_sms_start_time,
'' receive_sms_end_time,
'' question,
'' answer
from erp_customer e
union all
select
'w' || ee.id as id,
ee.id username,
ee.name,
'' password,
'w' as type,
'员工' as type_name,
input_code,
ee.sex gender,
(select name from base_dep bd where bd.code = ee.base_dep_code) base_dep_name,
ee.base_dep_code,
'' state,
telephone,
ee.email,
mobile,
qq,
'' receive_sms,
'' receive_sms_start_time,
'' receive_sms_end_time,
'' question,
'' answer
from erp_employee ee;
这个视图查出来的数据是包括这几个表联合后的所有信息,这样如果在这个试图基础上去加筛选条件就会使得查询数据变得十分的简单.
在写代码的时候就可以把数据库变成试图这样代码更加清晰且容易阅读,并且也十分规范.
private static final String TABLENAME = "V_SYSTEM_USER";申明视图
StringBuffer sql = new StringBuffer();
sql.append(" select * from " + TABLENAME + " t where 1=1 " );
if(!CommonFun.isNe(filter)){
sql.append(" and Upper(id||username||name||type_name||base_dep_code||email||input_code) like :filter");
}
params.put("filter", "%" + filter.toUpperCase() + "%");
在编程行业中,复用真的应该无处不在,特别是面向对象语言中,一定要养成这种习惯.
相关文章推荐
- UTF-8和GBK编码之间的区别(页面编码、数据库编码区别)以及在实际项目中的应用
- 数据库优化-水平切分-以及在实际项目中的应用
- 数据库优化-垂直切分以及在实际项目中的应用
- 自己封装的一个iphone上的缓存,支持内存缓存以及磁盘缓存,实际项目已经应用。
- DWR在实际项目中的应用以及在调试过程中遇到的问题
- WCF在项目实际生产中的引用方式以及一些引用建议及如何把svcutil.exe加载到VS中的tool中
- android实际项目中数据库的应用(增删改查)
- 委托--事件--基础以及在现在做的项目上的实际应用(一)
- 数据库(sqlite3)项目实际应用
- 字典树的基础,以及在实际项目中对于敏感词的替换的应用
- 委托--事件--基础以及在现在做的项目上的实际应用(三)
- (7)java5线程并发库的应用(线程池) 以及在实际项目中的使用。。
- 第十五章 分析在实际项目中该如何应用jdbc
- ASP.NET 之 CheckBoxList在实际项目中的应用——高级查询、数据库读出默认选中
- 在框架窗口中如何获得,视图类的指针以及文档,视图,框架窗口指针的获取与应用
- 关于OC中消息转发机制的理解以及在项目中的实际应用
- 18.如何在实际项目中应用ROS导航相关
- 关于OC中消息转发机制的理解以及在项目中的实际应用
- AngularJS实际项目应用——前端js框架以及库介绍
- Spring学习笔记——Spring如何装配各种类型的属性以及实际应用