2016-08-23 54 views
0

我真的新手跟我的SQL和IM试图创造一些意见的击打MySQL的叫喊,错误MySQL视图中删除的子查询中FROM条件

ERROR 1349(HY000):视图的SELECT语句包含在一个子查询 条款

如何删除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 

回答

0

创建视图的过程中,您不能使用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; 

有了这个,性能将会受到影响......但为了克服这个错误,你不能使用子查询动态。如果你可以肯定更好的重写查询。

+0

性能明智,对于数据库性能来说,这对于from子句本身中的子查询来说更是一场灾难。好吧,至少它会起作用。更好的做法是重写查询,而不是在临时表上堆积临时表。 MySQL有理由禁止这样的开始。 – Kaii

+0

@Kaii我同意这样一个事实,即性能会受到影响......但为了克服这个错误,您不得使用子查询动态..如果可以的话肯定会更好地重写查询..我也添加这个建议来回答。 – scaisEdge