2011-12-08 670 views
85

我有两个表,我需要创建一个视图。这些表是:视图的SELECT包含FROM子句中的子查询

credit_orders(id, client_id, number_of_credits, payment_status) 
credit_usage(id, client_id, credits_used, date) 

我使用下面的查询来做到这一点。没有“创建视图”部分的查询运行良好,但使用“创建视图”时,它显示错误“视图的SELECT包含FROM子句中的子查询”。可能是什么问题&可能的解决方案:

create view view_credit_status as 
(select credit_orders.client_id, 
     sum(credit_orders.number_of_credits) as purchased, 
     ifnull(t1.credits_used,0) as used 
from credit_orders 
left outer join (select * from (select credit_usage.client_id, 
             sum(credits_used) as credits_used 
           from credit_usage 
           group by credit_usage.client_id) as t0 
       ) as t1 on t1.client_id = credit_orders.client_id 
where credit_orders.payment_status='Paid' 
group by credit_orders.client_id) 
+0

可能重复的[MySQL:在FROM子句限制中查看子查询](http://stackoverflow.com/questions/206062/mysql-view-with-subquery-in-the-from-clause-limitation) –

+0

@MattFenwick,不,它不是 - 那个查询可以很容易地被重写,这在一般情况下是不可能的 – TMS

+0

从10.2.1版本的mariadb'10.2'支持子查询请参阅 - https://jira.mariadb.org/browse/MDEV-3944 –

回答

130

按照文档:

MySQL Docs

  • SELECT语句不能包含一个子查询在FROM子句中。

您的解决方法是为每个子查询创建一个视图。

然后访问从这些观点你的观点view_credit_status

+14

请注意,嵌套视图会导致严重的性能损失。 – miguelcobain

+1

@miguelcobain,创建一个新的视图只是为了嵌套它并不能消除你所说的“严重的性能损失”。那么是什么给了? – Pacerier

+16

现在允许5.7! :-) –

13
create view view_clients_credit_usage as 
    select client_id, sum(credits_used) as credits_used 
    from credit_usage 
    group by client_id 

create view view_credit_status as 
    select 
     credit_orders.client_id, 
     sum(credit_orders.number_of_credits) as purchased, 
     ifnull(t1.credits_used,0) as used 
    from credit_orders 
    left outer join view_clients_credit_usage as t1 on t1.client_id = credit_orders.client_id 
    where credit_orders.payment_status='Paid' 
    group by credit_orders.client_id) 
5

内由于最近的MySQL文档view restrictions说:

的MySQL 5.7.7之前,子查询不能使用的FROM子句的观点。

这意味着,选择MySQL v5.7.7或更高版本或将现有MySQL实例升级到此类版本,将完全消除对视图的限制。

但是,如果您有一个早于v5.7.7的当前生产MySQL版本,那么对视图的这一限制的去除应该只是在作出是否升级的决定时被评估的标准之一。使用其他答案中描述的解决方法技术可能是更可行的解决方案 - 至少在短期内。

0

对我来说,MySQL 3.6给出了以下错误,而MySQL 3.7不再出错。我还没有找到有关此修复的文档中的任何内容。

相关问题