Maison >base de données >tutoriel mysql >Pourquoi MySQL interdit-il les sous-requêtes dans la clause FROM d'une vue ?
"Le SELECT de la vue contient une sous-requête dans la clause FROM" : Comprendre les contraintes de vue MySQL
Les vues MySQL offrent un moyen pratique de simplifier la récupération des données en présentant un sous-ensemble personnalisé de données à partir de tables sous-jacentes. Cependant, il existe certaines restrictions pour garantir l'intégrité et les performances de ces vues.
L'une de ces restrictions est l'interdiction des sous-requêtes dans la clause FROM d'une vue. Dans l'exemple fourni, la requête :
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)
renvoie l'erreur "View's SELECT contient une sous-requête dans la clause FROM" car elle contient la sous-requête suivante :
(select * from (select credit_usage.client_id, sum(credits_used) as credits_used from credit_usage group by credit_usage.client_id) as t0 )
Pour résoudre ce problème problème, on peut créer des vues distinctes pour les sous-requêtes. Par exemple, on pourrait créer les vues suivantes :
create view view_credit_orders as (select credit_orders.client_id, sum(credit_orders.number_of_credits) as purchased from credit_orders where credit_orders.payment_status='Paid' group by credit_orders.client_id) create view view_credit_usage as (select credit_usage.client_id, sum(credit_usage.credits_used) as credits_used from credit_usage group by credit_usage.client_id)
Une fois ces vues créées, la vue originale peut être créée à l'aide de la requête modifiée suivante :
create view view_credit_status as (select view_credit_orders.client_id, view_credit_orders.purchased, ifnull(view_credit_usage.credits_used,0) as used from view_credit_orders left outer join view_credit_usage on view_credit_orders.client_id = view_credit_usage.client_id)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!