110 votes

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)
 

153voto

Nonym Points 3551

Selon la documentation:

MySQL Docs

  • 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.

Ensuite, accédez à ces vues depuis votre vue view_credit_status

16voto

Michał Powaga Points 8949
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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X