View 的 SELECT 包含 FROM 子句中的子查询

Posted

技术标签:

【中文标题】View 的 SELECT 包含 FROM 子句中的子查询【英文标题】:View's SELECT contains a subquery in the FROM clause 【发布时间】:2011-12-08 09:16:36 【问题描述】:

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

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)

【问题讨论】:

mysql: View with Subquery in the FROM Clause Limitation的可能重复 @MattFenwick,不,不是 - 查询可以轻松重写,这通常是不可能的 mariadb 10.2 从版本 10.2.1 支持子查询请参阅 - jira.mariadb.org/browse/MDEV-3944 【参考方案1】:

根据文档:

MySQL Docs

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

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

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

【讨论】:

请注意,嵌套视图会导致严重的性能损失。 @miguelcobain,创建一个新视图只是为了嵌套它并不能消除您所说的“严重的性能损失”。那么是什么给了? 现在在 5.7 中允许! :-) 在 MariaDB 中也不允许【参考方案2】:
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)

【讨论】:

【参考方案3】:

正如view restrictions 上最新的 MySQL 文档所说:

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于View 的 SELECT 包含 FROM 子句中的子查询的主要内容,如果未能解决你的问题,请参考以下文章

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

带有联合错误的 MySQL 视图 - “视图的 SELECT 包含 FROM 子句中的子查询”

ERROR 1349 (HY000): View 的 SELECT 在 FROM 子句中包含子查询

错误 #1349:View 的 select cluse 在 from 子句中包含子查询

ERROR 1349:视图的 SELECT 在 FROM 子句中包含子查询

MySql VIEW 删除 FROM 条件下的子查询