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 子句中的子查询