我收到MySQL 1349
错误,但似乎错误不正确:
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
)
感谢您的时间。
答案 0 :(得分:3)
您错过了MySQL中的视图不允许from
子句中的子查询这一事实。但是,select
和where
以及having
条款允许这样做。
documentation非常明确:
子视图不能在视图的FROM子句中使用。
在您的情况下,您可以将from
子句重写为select
子句中的相关子查询。您还可以使用多个视图层来执行所需的操作。
编辑:
SQL中的SELECT语句具有以下子句:SELECT
,FROM
,WHERE
,GROUP BY
,HAVING
和ORDER BY
(根据标准)。此外,MySQL添加了LIMIT
和INTO OUTFILE
之类的内容。您可以通过MySQL描述documentation中的SELECT
子句的方式来看到这一点。您也可以在几乎所有数据库的文档中看到这一点。
join
这样的操作是FROM
子句的一部分(同样WITH ROLLUP
是GROUP BY
的一部分而DESC
是ORDER BY
的一部分}})。这些似乎是一种神秘的句法惯例,但是当存在上述限制时它变得很重要。
混淆的一个原因可能是缩进样式:
select . . .
from t1
inner join t2
on . . .
连接语句在select
下排列。这是误导。我会把它写成:
select
from t1 join
t2
on . . .
只有select
条款排在select.
答案 1 :(得分:3)
以上答案是正确的。 MySQL 5.5不允许FROM子句中的子查询。但是,现在允许在MySQL 5.7.7及更高版本中使用它。
答案 2 :(得分:0)