2

我收到 MySQL1349错误,但似乎错误不正确:

ERROR 1349: View's SELECT contains a subquery in the FROM clause

创建视图时可以没有任何子查询吗?

这是我的 SQL:

CREATE VIEW  `wordpress`.`ffi_be_v_book_details` AS (
  SELECT ffi_be_courses. * , COALESCE(  `Total` , 0 ) AS  `Total` 
  FROM  `ffi_be_courses` 
  LEFT JOIN (
    SELECT * , COUNT(  `Course` ) AS  `Total` 
    FROM ffi_be_courses
    RIGHT JOIN (
      SELECT  `Course` 
      FROM  `ffi_be_bookcourses` 
      LEFT JOIN  `ffi_be_sale` ON ffi_be_bookcourses.SaleID = ffi_be_sale.SaleID
      WHERE DATE_ADD( ffi_be_sale.Upload, INTERVAL( 
        SELECT  `BookExpireMonths` 
        FROM  `ffi_be_settings` ) MONTH ) > CURDATE( ) AND ffi_be_sale.Sold =  '0'
      GROUP BY ffi_be_bookcourses.SaleID
    ) AS  `q1` ON ffi_be_courses.Code = q1.Course
    GROUP BY q1.Course
  ) AS  `q2` ON ffi_be_courses.Code = q2.Code
  WHERE ffi_be_courses.Type =  'Arts'
  ORDER BY ffi_be_courses.Name ASC
)

感谢您的时间。

4

2 回答 2

4

您错过了 MySQL 中的视图不允许from子句中的子查询这一事实。但是,它们在selectandwherehaving子句中是允许的。

文档很清楚:

子查询不能在视图的 FROM 子句中使用。

在您的情况下,您可能可以将该子句重写为from子句中的相关子查询select。你也可以使用多层视图来做你想做的事。

编辑:

SELECTSQL中FROM的SELECT 语句具有以下子句:、、、、、、 和WHERE(根据标准)。此外,MySQL 添加了, 和. 您可以通过 MySQL 在文档中描述子句的方式看到这一点。您还可以在几乎所有数据库的文档中看到这一点。GROUP BYHAVINGORDER BYLIMITINTO OUTFILESELECT

诸如joinareFROM子句的一部分的操作(类似地WITH ROLLUP是 the 的一部分GROUP BY并且DESC是 the 的一部分ORDER BY)。这些看起来像是晦涩难懂的句法约定,但当有上述限制时,它就变得很重要。

造成混淆的一个原因可能是缩进样式,如下所示:

select . . .
from t1
inner join t2
     on . . .

连接语句在select. 这是误导。我会这样写:

select 
from t1 join
     t2
     on . . .

只有select条款在select.

于 2013-08-01T00:41:16.963 回答
0

参考文档——

视图定义受以下限制:

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

为每个 FROM 子句创建一个单独的视图。

于 2013-08-01T00:43:13.133 回答