mysql视图创建细节1349错误

        开发过程中写了一条sql,具体如下

select A.name,A.userid,D.orgname,IFNULL(B.bixiuCount,0),IFNULL(B.xuanxiuCount,0),IFNULL(C.gwBX,0),IFNULL(C.gwXX,0) from 
(select person.personid,person.name,users.userid,person.position,person.organizationid 
from t_hr_person person LEFT JOIN t_rights_user users on person.personid = users.personid 
WHERE person.isdelete=0 and users.isdelete=0) A LEFT JOIN
(select userid,
IFNULL(sum(case when(courseflag=0 ) then 1 else 0 end),0) bixiuCount,
IFNULL(sum(case when(courseflag=1 ) then 1 else 0 end),0) xuanxiuCount
from t_user_course where isdelete=0 
GROUP BY userid) B on A.userid = B.userid 
LEFT JOIN (
SELECT  GWC.dictionaryId dictionaryId,SUM(case WHEN (type=0) THEN 1 else 0 END) gwBX,SUM(case WHEN (type=1) THEN 1 else 0 END) gwXX
 FROM t_gwcourse GWC where GWC.isdelete=0
GROUP BY GWC.dictionaryId

) C ON C.dictionaryId=A.position left JOIN t_hr_organization D ON A.organizationid=D.organizationid

        计划是创建成一个视图,方便使用,在保存的时候报了如下错误

        1349 - View's SELECT  contains a subquery in the FROM clause

        

        意思就是视图创建的sql语句中在from后面包含了子查询,这在mysql中是不允许的。学习mysql的时候这应该是在刚开始的部分学习的,有段时间没有接触到所以自己也忘记了。回忆了一下mysql创建视图的注意事项,加上google,贴在下面

        SELECT语句不能包含FROM子句中的子查询。
        SELECT语句不能引用系统或用户变量。
         SELECT语句不能引用预处理语句参数。
        在存储子程序内,定义不能引用子程序参数或局部变量。
        在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。
        在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。
        在视图定义中命名的表必须已存在。
        不能将触发程序与视图关联在一起。

        解决问题的方法也很简单,把from后面的子查询单独创建为视图即可解决,不得不说mysql的视图确实是不太智能,不论是创建还是性能上,关于性能有一篇简单解析的文章讲了如何初步的提升视图的性能,连接如下:

        http://wangyuanzju.blog.163.com/blog/static/130292007714102859807/

        

扫描二维码关注公众号,回复: 2253485 查看本文章

猜你喜欢

转载自blog.csdn.net/a672845190/article/details/81064751