Maison >base de données >tutoriel mysql >Pourquoi MySQL interdit-il les sous-requêtes dans la clause FROM d'une vue ?

Pourquoi MySQL interdit-il les sous-requêtes dans la clause FROM d'une vue ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-25 18:55:16416parcourir

Why Does MySQL Prohibit Subqueries in a View's FROM Clause?

"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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn