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

Posted

技术标签:

【中文标题】MySql VIEW 删除 FROM 条件下的子查询【英文标题】:MySql VIEW remove subquery in FROM condition 【发布时间】:2016-08-23 19:46:36 【问题描述】:

我真的是我的 sql 的新手,我试图创建一些视图但是 mysql 大喊错误

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

如何删除 FROM 条件中的子查询并在视图中获得相同的结果?

SELECT actual, 
        curr, 
        CASE WHEN actual > anterior THEN 'raise' 
            WHEN actual < anterior THEN 'drop' ELSE 'nothing' 
        END as 'status' 
FROM ( 
        SELECT o.i_price as actual, o.i_currency as curr, 
            (
                SELECT i.i_price 
                FROM Info i 
                WHERE i.i_article_id = 1 
                  AND i.i_insert < o.i_insert 
                ORDER BY i.i_insert DESC LIMIT 1
            ) AS anterior 
        FROM Info o 
        WHERE o.i_article_id = 1 
        ORDER BY o.i_insert 
        DESC LIMIT 1 ) as q

【问题讨论】:

【参考方案1】:

在创建视图的过程中不能使用 dinamica 子查询,所以你应该为子查询创建一个合适的视图

    create view my_q as 
    SELECT o.i_price as actual, o.i_currency as curr, 
                (
                    SELECT i.i_price 
                    FROM Info i 
                    WHERE i.i_article_id = 1 
                      AND i.i_insert < o.i_insert 
                    ORDER BY i.i_insert DESC LIMIT 1
                ) AS anterior 
            FROM Info o 
            WHERE o.i_article_id = 1 
            ORDER BY o.i_insert 
            DESC LIMIT 1

然后在你的顶视图中调用视图

    create  view my_top_view as  
    SELECT actual, 
            curr, 
            CASE WHEN actual > anterior THEN 'raise' 
                WHEN actual < anterior THEN 'drop' ELSE 'nothing' 
            END as 'status' 
    FROM  my_q;

这样性能会受到影响..但是要克服错误,您不能使用子查询动态..如果可以的话,重写查询肯定更好。

【讨论】:

在性能方面,这对数据库性能来说甚至比 from 子句本身中的子查询更加灾难性。好吧,至少它会起作用。更好的是重写查询而不是在临时表上堆叠临时表。 MySQL 有理由禁止这样的启动。 @Kaii 我同意性能会受到影响的事实.. 但是要克服错误,您不能使用子查询动态.. 如果可以的话,最好重写查询.. 我添加了这个建议也回答。【参考方案2】:

View 的选择包含子查询错误:您可以解决这个问题。使用 mysql mysqlworkbench 连接 mysql 数据库。并从 mysqlworkbench 运行创建视图脚本。它会工作

【讨论】:

以上是关于MySql VIEW 删除 FROM 条件下的子查询的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询

第四章 MySQL高级查询

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

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

mysql常用基础操作语法~~子查询命令行模式

0815 mysql视图用户