VIEW'S SELECT содержит подзапрос в предложении FROM

у меня есть две таблицы, и мне нужно создать представление. Таблицы:

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

для этого я использую следующий запрос. Запрос без части " создать представление "работает хорошо, но с" создать представление "он показывает ошибку"выбор представления содержит подзапрос в предложении 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)

4 ответов


согласно документации:

MySQL Docs

  • инструкция SELECT не может содержать подзапрос в предложении FROM.

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

затем получите доступ к этим представлениям из вашего представления view_credit_status


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)

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

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

Это означает, что выбор MySQL v5.7.7 или новее или обновление существующего экземпляра MySQL до такой версии полностью удалит это ограничение на представления.

однако, если у вас есть текущая версия MySQL производства, которая раньше, чем v5.7.7, тогда снятие этого ограничения в отношении мнений должно быть лишь одним из критериев оценки при принятии решения об обновлении или нет. Использование методов обхода, описанных в других ответах, может быть более жизнеспособным решением - по крайней мере, в более короткой перспективе.


выглядит так, как MySQL 3.6 дает следующую ошибку, в то время как MySQL 3.7 больше не ошибается. Я еще не нашел ничего в документации, касающейся этого исправления.