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)
Selon la documentation:
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
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 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.
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.