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
Libérer: 2024-12-25 18:55:16
original
509 Les gens l'ont consulté

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)
Copier après la connexion

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
)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal