在创建视图的过程中,有时可能需要调用另一个视图,例如新建的视图为v2,调用一个存在的视图v1。如果v1中有很多列的存在,有的开发人员可能为了省事,就直接使用了v1.*。
比如说创建视图v2如下:
---假设v1要去关联的表为tableName
create view v2 as
select v1.*,column1,column2,column3
from v1 left outer join tableName on v1.id=tableName.id
这会有一个隐藏的问题就是,如果视图v1中新增一列的情况下,这时视图v2里面就会发生列错位的情况,相当于column1 这个列其实读取的是新增列的那列数据,colunm2读取的是column1的列数据等等以此类推。
有读者可能问了,那把v1.*放到后面不就行了,如下的创建视图的sql
---假设v1要去关联的表为tableName
create view v2 as
select column1,column2,column3,v1.*
from v1 left outer join tableName on v1.id=tableName.id
这样v1中新增列就不会发生读取数据的错误了,我想说这也是一种解决方案,v1中新增列也不会发生数据读取错误的情况。可是问题出现在v1中如果删除了一列,那么此视图就会发生错误,提示列不等的情况。
因此还是建议把v1中想查询的列给指明出来。如下:
---假设v1要去关联的表为tableName
create view v2 as
select column1,column2,column3,v1.column1,v2.column2,v3.column3
from v1 left outer join tableName on v1.id=tableName.id