2013-08-01 4 views
0

Я получаю 1349 ошибку MySQL, но это, кажется, как будто ошибка неверно: при создании представленияMySQL ERROR 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

Привет, вы можете попробовать сделать несколько просмотров - по одному для каждого подзапроса – Fox

+0

@Fox Я знаю, что могу создавать несколько видов, но я не хотел иметь избыток просмотров, чтобы получить один вид, который я надеялся строить. Спасибо хоть. –

ответ

3

Вам не хватает того факта, что представления в MySQL не допускают подзапросы в предложении from. Однако они допускаются в статьях select и where и having.

documentation совершенно ясно:

подзапросы не могут быть использованы в ЕКЕ целей.

В вашем случае, вероятно, можно переписать условие from как коррелированные подзапросы в предложении select. Вы также можете использовать несколько уровней просмотров, чтобы делать то, что хотите.

РЕДАКТИРОВАТЬ:

утверждение SELECT и в SQL имеет следующие пункты: SELECT, FROM, WHERE, GROUP BY, HAVING и ORDER BY (в соответствии со стандартом). Кроме того, MySQL добавляет такие вещи, как LIMIT и INTO OUTFILE. Вы можете видеть это так, как MySQL описывает предложение SELECT в documentation. Вы также можете увидеть это в документации практически для любой базы данных.

Операции, такие как 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.

+0

Не могли бы вы указать, где конкретно у меня есть подзапрос в предложении from? Я не делаю 'SELECT FROM (SELECT ...) query' –

+0

@ spryno724. , , У вас есть 'left join (выберите ...'. –

+0

@ spryno724 Ваш LEFT JOIN использует подзапрос, вы не можете сделать этого в представлении – Taryn

0

Обратитесь к documentation -

Определение мнение с учетом следующих ограничений:

Оператор SELECT не может содержать подзапрос в предложении FROM.

Создайте отдельный просмотр для каждого из предложения FROM.

2

Вышеуказанные ответы верны. MySQL 5.5 не разрешает подзапросы в предложении FROM. Теперь это разрешено в MySQL 5.7.7 и более поздних версиях.

Смежные вопросы