在MySQL中不使用子查询创建视图

时间:2014-08-29 02:31:37

标签: mysql subquery sql-view

我正在处理一个包含mysql数据库的项目。

我想创建一个使查询更容易的视图。但我遇到了问题。由于视图中使用的表包含大约100.000行,并且我加入其中四个,因此视图必须使用合并算法。但根据MySQL documentaion

  如果视图包含以下任何内容,则

MERGE 无法使用   构建体:

     
      
  • 聚合函数(SUM(),MIN(),MAX(),COUNT()等)
  •   
  • DISTINCT
  •   
  • GROUP BY
  •   
  • HAVING
  •   
  • LIMIT
  •   
  • UNION或UNION ALL
  •   
  • 选择列表中的子查询
  •   
  • 仅指文字值(在这种情况下,没有基础表)
  •   

那么如果已存在某些内容,我将如何插入查找

EXIST( SELECT id FROM table WHERE col > val) AS flag

或属于其他ID的最新ID

(SELECT id FROM payments WHER contract_id = val ORDER BY id DESC LIMIT 1) AS last_payment_id

进入视图,不使用子查询?目前我试图避免这种情况。在某些情况下,我可以添加一个有效的行周期(DATE valid_from,DATE valid_to),这样每个contract_id的al周期都是不同的,所以它是唯一的,所以我不需要排序或限制。但这真是难看。

是否有推荐的方法在没有子查询的情况下进行此类子查询?

或者我只是想欺骗我这些事情?

注意:对于所有视图,FROM子句中的子查询也是禁止的,因此也不是一个选项。

澄清

我正在寻找一种方法来获得具有相同结果的视图,例如

CREATE VIEW viewName
AS
SELECT a.someColumn, 
  EXIST( SELECT a FROM table2 t WHERE t2.date > NOW()) AS flag, 
  (SELECT id FROM table3 ORDER BY id DESC LIMIT 1) AS latest_id
 FROM table1

使用合并算法。

1 个答案:

答案 0 :(得分:1)

使用DETERMINISTICREADS SQL DATA指令创建一个存储函数,该指令接受执行子查询所需的任何参数。在函数内部执行子查询,并返回结果。

然后引用视图中的函数。

虽然看似反直觉,但这种抽象允许使用ALGORITHM=MERGE声明视图,并进行相应处理,因此您不会遇到与TEMPTABLE相关联的性能问题。 / p>