欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql中视图里的使用子查询

程序员文章站 2022-06-02 08:29:41
...

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