Question

Comment puis-je définir une vue qui a deux champs calculés, par exemple ...

 ('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles

... et créer un troisième champ calculé qui est basé sur les deux premiers champs calculés, comme dans ...

 ('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes

...?

Quand je référence les deux premiers champs calculés par nom, je reçois un message que les champs ne sont pas connus.

Merci!

Était-ce utile?

La solution

Étant donné que les sous-requêtes ne sont pas autorisés dans les vues, vous aurez besoin de les simuler en créant plusieurs vues.

Par exemple, cette requête va résoudre votre problème si elle est exécutée directement:

SELECT 
    TotalCircles + TotalSquares AS TotalShapes
FROM
    (SELECT 
        BlueCirles + RedCircles AS TotalCircles,
        BlueSquares + RedSquares AS TotalSquares
    FROM
        (SELECT
            2 AS BlueCirles,
            3 AS RedCircles,
            4 AS BlueSquares,
            5 AS RedSquares
        ) AS shapes
    ) as totals;

Selon le point de vue de la documentation MySQL ont la restriction à ne pas être en mesure de contenir les sous-requêtes dans la clause FROM. Pour contourner cette limitation et tourner cette requête en vue, le diviser en 3 vues (une pour chaque sous-requête) avec la dernière donnant la combinaison souhaitée des champs:

CREATE VIEW shapes AS
SELECT
    2 AS BlueCirles,
    3 AS RedCircles,
    4 AS BlueSquares,
    5 AS RedSquares;

CREATE VIEW totals AS
SELECT 
    BlueCirles + RedCircles AS TotalCircles,
    BlueSquares + RedSquares AS TotalSquares
FROM
    shapes;

CREATE VIEW result AS
SELECT 
    TotalCircles + TotalSquares AS TotalShapes
FROM
    totals;

SELECT * FROM result;

Autres conseils

  

... créer un troisième champ calculé qui est basé sur les deux premiers champs calculés ...

Comme vous l'avez trouvé, vous ne pouvez pas référencer des colonnes calculées dans la même SELECT. Vos options sont:

Dupliquer la logique

MySQL ne supporte pas les sous-requêtes dans les vues pour une raison étrange:

CREATE OR REPLACE VIEW your_view AS
SELECT t.BlueSquares + t.RedSquares AS TotalSquares, 
       t.BlueCirles + t.RedCircles AS TotalCircles,
       t.BlueSquares + t.RedSquares + t.BlueCirles + t.RedCircles AS TotalShapes
  FROM TABLE t

Calque les vues

option la moins recommandée ...

 CREATE OR REPLACE VIEW initial_view AS
    SELECT t.BlueSquares + t.RedSquares AS TotalSquares, 
           t.BlueCirles + t.RedCircles AS TotalCircles,
      FROM TABLE

 CREATE OR REPLACE VIEW layered_view AS
    SELECT iv.TotalSquares + iv.TotalCircles AS TotalShapes
      FROM initial_view iv

Malheureusement, ce que vous essayez de faire est pas réellement possible la façon dont vous le faites. En général, MySQL vues peuvent être considérés comme un SELECT scénarisé. Les résultats d'une vue ne sont pas stockées sur la base de données séparée de leur source, mais sont plutôt calculés lorsque vous faites référence à la vue.

La plupart du temps, MySQL utilise l'algorithme de MERGE lorsque vous sélectionnez d'une vue. Cela signifie qu'il fusionne la définition de votre point de vue et l'instruction SELECT se référant à la vue pour créer une finale SELECT il fonctionne réellement. En tant que tel, vous ne pouvez pas vraiment VIEW se référer à lui-même.

Vos options ici sont (1) définir une seconde vue qui se réfère à la première vue afin de créer votre somme, ou (2) écrire la somme longhand comme ceci:

('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
scroll top