web-dev-qa-db-fra.com

SELECT's View contient une sous-requête dans la clause FROM

J'ai deux tables et je dois créer une vue. Les tableaux sont:

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

J'utilise la requête suivante pour le faire. La requête sans la partie "créer une vue" fonctionne bien, mais avec "créer une vue", elle indique l'erreur "La vue de la vue contient une sous-requête dans la clause FROM". Quel pourrait être le problème et la solution possible:

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)
99
Raouf Athar

Selon la documentation: 

Docs MySQL

  • L'instruction SELECT ne peut pas contenir de sous-requête dans la clause FROM.

Votre solution consiste à créer une vue pour chacune de vos sous-requêtes.

Accédez ensuite à ces vues depuis votre vue view_credit_status

144
Nonym
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)
15
Michał Powaga

Comme le dit la documentation plus récente de MySQL sur restrictions de vue dit:

Avant MySQL 5.7.7, les sous-requêtes ne pouvaient pas être utilisées dans la clause FROM d'une vue. 

Cela signifie que le fait de choisir une version 5.7.7 de MySQL ou une version plus récente ou de mettre à niveau l'instance existante de MySQL vers une telle version supprimerait complètement cette restriction sur les vues.

Toutefois, si votre version de MySQL de production actuelle est antérieure à v5.7.7, la suppression de cette restriction sur les vues ne doit être qu'un des critères évalués lors de la prise de décision de mise à niveau ou non. L'utilisation des techniques de contournement décrites dans les autres réponses peut constituer une solution plus viable, du moins à court terme.

12
Shadow

Il me semble que MySQL 3.6 donne l’erreur suivante, alors que MySQL 3.7 n’a plus d’erreur Je n'ai encore rien trouvé dans la documentation concernant ce correctif.

0
user3809638