mysql中视图里的使用子查询

xiaoxiao2021-03-01  27

有人说视图里不能使用子查询。其实不完全对。mysql 目前版本中,

大部分SELECT,WHERE,GROUP,ORDER 子句中还是可以使用子查询的,如:

-- SELECT 简单输出的子查询 可以 create or replace view vtest AS select 1 a,(select 2 from dual) as x from dual; select * from vtest; -- SELECT 简单输出的业务表子查询 可以 create or replace view vtest AS select userid a,(select count(1) from cp_ecar_car a WHERE a.userid=u.userid) as x from cp_userinfo u; select * from vtest; -- SELECT 多个输出的业务表子查询 可以 create or replace view vtest AS select userid a,(select count(1) from cp_ecar_car a WHERE a.userid=u.userid) as x, (select count(1) from cp_ecar_share a WHERE a.userid=u.userid) as y from cp_userinfo u; select * from vtest; -- WHERE 查询表条件 in关联子查询 支持 create or replace view vtest AS select u.userid a from cp_userinfo u where u.userid in (select userid from cp_ecar_car a GROUP BY userid); select * from vtest; -- WHERE 查询表条件 exists关联子查询 支持 create or replace view vtest AS select u.userid a from cp_userinfo u where exists(select userid from cp_ecar_car a where a.userid=u.userid); select * from vtest; -- WHERE 查询表条件 比较关联子查询 支持 create or replace view vtest AS select u.userid a from cp_userinfo u where userid>(select max(userid) from cp_ecar_car a); select * from vtest; -- GROUP 分组关联子查询字段 支持 create or replace view vtest AS select u.userid a from cp_userinfo u GROUP BY (select gradename from cp_usergrade a where a.usergrade=u.usergrade) ; select * from vtest; -- ORDER BY 分组关联子查询字段 支持 create or replace view vtest AS select u.userid a from cp_userinfo u ORDER BY (select gradename from cp_usergrade a where a.usergrade=u.usergrade) ; select * from vtest;

新版本中,FROM和JOIN子句中跟子查询还是没有支持,如

-- FROM查询表关联子查询 不支持 create or replace view vtest AS select u.userid a,b.counts as x from cp_userinfo u, (select userid ,count(1) counts from cp_ecar_car a GROUP BY userid) b where u.userid=b.userid; select * from vtest; -- JOIN表关联子查询 不支持 create or replace view vtest AS select u.userid a,b.counts as x from cp_userinfo u LEFT JOIN (select userid ,count(1) counts from cp_ecar_car a GROUP BY userid) b on u.userid=b.userid; select * from vtest;

很多时候根据业务有有这个需要。网上流传的大部分是标准的方法:

就是创建一个2个子查询,然后关联子句中,把子查询替换成子视图名称。缺点是要多创建一个子视图

是否还有别的办法呢?

这里提供了一个办法,但需要具备一定的sql分析转换能力。借助sum,count等分组统计函数,如上2个查询可以修改为如下。

-- FROM查询表关联子查询 不支持 create or replace view vtest AS select u.userid a,count(1) as x from cp_userinfo u, cp_ecar_car b where u.userid=b.userid GROUP BY u.userid; select * from vtest; -- JOIN表关联子查询 不支持 create or replace view vtest AS select u.userid a,count(1) as x from cp_userinfo u LEFT JOIN cp_ecar_car b on u.userid=b.userid GROUP BY u.userid; select * from vtest;

需要说明的是,这样修改,需要清楚表之间的关系,是一对一,一对多,多对多。否则可能不是预期结果。 需要增加一些辅助条件。这里不一一阐述。

有需要的朋友,可以发出sql语句来讨论

转载请注明原文地址: https://www.6miu.com/read-3450180.html

最新回复(0)