Le SELECT de View contient une sous-requête dans la clause FROM

J’ai deux tables et j’ai besoin de créer une vue. Les tables 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 ce faire. La requête sans la partie “create view” fonctionne bien mais avec “create view”, elle affiche l’erreur “SELECT de View 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) 

Selon la documentation:

Documents MySQL

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

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

Accédez ensuite à ces vues à partir de votre vue 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) 

Comme le dit la documentation plus récente de MySQL sur les ressortingctions d’affichage :

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 choisir MySQL v5.7.7 ou plus récent ou mettre à niveau l’instance MySQL existante vers une telle version supprimerait complètement cette ressortingction sur les vues.

Cependant, si vous avez une version MySQL de production antérieure à la version 5.7.7, la suppression de cette ressortingction sur les vues ne devrait être que l’un des critères évalués lors de la 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.

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