View SELECT містить підзапит у пункті FROM


111

У мене дві таблиці, і мені потрібно створити подання. Таблиці:

credit_orders(id, client_id, number_of_credits, payment_status)
credit_usage(id, client_id, credits_used, date)

Для цього я використовую наступний запит. Запит без частини "create view" працює добре, але з "create view" він показує помилку "View SELECT містить підзапит у пункті FROM". Що може бути проблемою та можливим рішенням:

create view view_credit_status as 
(select credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
 from credit_orders
 left outer join (select * from (select credit_usage.client_id, 
                                        sum(credits_used) as credits_used 
                                 from credit_usage 
                                 group by credit_usage.client_id) as t0
                  ) as t1 on t1.client_id = credit_orders.client_id
 where credit_orders.payment_status='Paid'
 group by credit_orders.client_id)


@MattFenwick, ні, це не так - цей запит можна легко переписати, що взагалі неможливо
TMS

Підтримки підтримуються в mariadb 10.2з версії 10.2.1Див. - jira.mariadb.org/browse/MDEV-3944
Adarsh ​​Madrecha

Відповіді:


157

Відповідно до документації:

Документи MySQL

  • Оператор SELECT не може містити підзапит у пункті FROM.

Вашим вирішенням буде створити перегляд для кожного з ваших запитів.

Потім перейдіть до цих поглядів зсередини перегляду view_credit_status


17
Зауважте, що вкладені зображення можуть спричинити серйозні штрафи за ефективність.
miguelcobain

1
@miguelcobain, Створення нового виду просто для створення гнізда не знімає "серйозні покарання за ефективність", про які ви говорите. То що дає?
Pacerier

28
Зараз дозволено в 5,7! :-)
Франсуа Бретон

4
Не дозволено і в MariaDB
peter

16
create view view_clients_credit_usage as
    select client_id, sum(credits_used) as credits_used 
    from credit_usage 
    group by client_id

create view view_credit_status as 
    select 
        credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
    from credit_orders
    left outer join view_clients_credit_usage as t1 on t1.client_id = credit_orders.client_id
    where credit_orders.payment_status='Paid'
    group by credit_orders.client_id)

13

Як свідчить свіжа документація на обмеження перегляду MySQL :

Перед MySQL 5.7.7 підзапити не можуть використовуватися в пункті FROM представлення.

Це означає, що вибір MySQL v5.7.7 або новішої або модернізація існуючого екземпляра MySQL до такої версії повністю видалить це обмеження для переглядів.

Однак, якщо у вас є поточна виробнича версія MySQL, яка раніше, ніж v5.7.7, видалення цього обмеження на представлення даних може бути лише одним із критеріїв, що оцінюються під час прийняття рішення щодо оновлення чи ні. Використання методів вирішення, описаних в інших відповідях, може бути більш життєздатним рішенням - принаймні на коротший термін.


0

Мені здається, що MySQL 3.6 видає таку помилку, поки MySQL 3.7 більше не виходить помилок. Я ще не знаходжу нічого в документації щодо цього виправлення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.