Maison >base de données >tutoriel mysql >Comment résoudre l'erreur « View's SELECT contient une sous-requête dans la clause FROM » de MySQL ?

Comment résoudre l'erreur « View's SELECT contient une sous-requête dans la clause FROM » de MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-27 12:51:09680parcourir

How to Resolve MySQL's

Dépannage de l'erreur « Le SELECT de la vue contient une sous-requête dans la clause FROM »

Lors de la création d'une vue à l'aide d'une requête contenant des sous-requêtes dans la clause FROM , MySQL peut rencontrer un message d'erreur indiquant "View's SELECT contient une sous-requête dans la clause FROM." Cette erreur indique que MySQL n'autorise pas les sous-requêtes dans la clause FROM des définitions de vue.

Détails de l'erreur

Considérez l'exemple suivant :

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
);

Cette requête tente de créer une vue nommée view_credit_status qui inclut des sous-requêtes dans la clause FROM. Cependant, MySQL générera l'erreur « Le SELECT de la vue contient une sous-requête dans la clause FROM ».

Solution

Pour résoudre ce problème, la solution de contournement consiste à créer des vues distinctes. pour les sous-requêtes et référencez ces vues à partir de la vue principale. Voici comment procéder :

  1. Créez une vue nommée temp_view_used_credits pour la sous-requête liée à l'utilisation du crédit :
create view temp_view_used_credits as
select credit_usage.client_id, sum(credits_used) as credits_used
from credit_usage
group by credit_usage.client_id;
  1. Créez la vue principale view_credit_status en utilisant les temp_view_used_credits view :
create view view_credit_status as
(
  select credit_orders.client_id,
    sum(credit_orders.number_of_credits) as purchased,
    ifnull(temp_view_used_credits.credits_used,0) as used
  from credit_orders
  left outer join temp_view_used_credits on temp_view_used_credits.client_id = credit_orders.client_id
  where credit_orders.payment_status='Paid'
  group by credit_orders.client_id
);

Cette approche sépare la sous-requête en une vue distincte, permettant à MySQL de la référencer dans la vue principale sans violer la restriction.

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