SELECT представления View содержит подзапрос в предложении FROM - PullRequest
106 голосов
/ 08 декабря 2011

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

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

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

Ответы [ 4 ]

148 голосов
/ 08 декабря 2011

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

MySQL Docs

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

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

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

16 голосов
/ 08 декабря 2011
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)
12 голосов
/ 13 марта 2017

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

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

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

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

0 голосов
/ 30 апреля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...