mysql中视图里的使用子查询

有人说视图里不能使用子查询。其实不完全对。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语句来讨论

猜你喜欢

转载自blog.csdn.net/zj53hao/article/details/81109988