View的SELECT在FROM子句中包含一个子查询


111

我有两个表,我需要创建一个视图。这些表是:

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)


@MattFenwick,不,不是-该查询可以轻松重写,这通常是不可能的
TMS

版本下面的mariadb支持子查询10.210.2.1请参见-jira.mariadb.org/browse/MDEV-3944
Adarsh Madrecha,

Answers:


156

根据文档:

MySQL文档

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

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

然后从您的视图中访问这些视图 view_credit_status


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

1
@miguelcobain,仅嵌套创建一个新视图并不会消除您正在谈论的“严重的性能损失”。那有什么呢?
Pacerier,2015年

28
现在允许在5.7中使用!:-)
弗朗索瓦·布雷顿

4
MariaDB也不允许
彼得

16
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)

13

正如有关视图限制的最新MySQL文档所述:

在MySQL 5.7.7之前,子查询不能在视图的FROM子句中使用。

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

但是,如果您当前的MySQL生产版本早于v5.7.7,则取消对视图的限制仅是在决定是否升级时要评估的标准之一。使用其他答案中描述的解决方法可能是一种更可行的解决方案-至少在较短的时间内。


0

在我看来,MySQL 3.6发出以下错误,而MySQL 3.7不再出现错误。我尚未在文档中找到有关此修复程序的任何内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.