MySQL Ansichten: Referenzierung eines berechnetes Feld (nach Namen) in einem anderen berechneten Feld

StackOverflow https://stackoverflow.com/questions/1895500

Frage

Wie kann ich definieren eine Ansicht, die zwei Felder berechnet hat, zum Beispiel ...

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

... und erstellen Sie ein drittes berechnetes Feld, das auf den ersten beiden berechneten Feldern basiert, wie in ...

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

...?

Als ich die ersten beiden berechneten Felder, die durch Namen verweisen, erhalte ich eine Meldung, dass die Felder sind nicht bekannt.

Danke!

War es hilfreich?

Lösung

Da Unterabfragen in Ansichten nicht erlaubt sind, müssen Sie sie simulieren, indem mehrere Ansichten zu schaffen.

Zum Beispiel dieser Abfrage wird Ihr Problem lösen, wenn sie direkt ausgeführt:

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;

Nach der MySQL Dokumentation Ansichten haben die Beschränkung nicht in der Lage, Unterabfragen in der FROM-Klausel zu enthalten. Um diese Einschränkung zu arbeiten und diese Abfrage in eine Ansicht drehen, sie zerfallen in drei Ansichten (ein für jede Unterabfrage) mit der letzten Angabe der gewünschten Kombination von Feldern:

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;

Andere Tipps

  

... ein drittes berechnetes Feld erstellen, die auf den ersten beiden Felder berechnet basiert ...

Wie Sie gefunden haben, können Sie nicht berechnete Spalten in der gleichen SELECT verweisen. Ihre Optionen sind:

Duplizieren Sie die Logik

MySQL nicht Subqueries in Ansichten aus irgendeinem Grunde unterstützen:

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

, um die Ansichten Schicht

Am wenigsten empfohlene Option ...

 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

Leider, was Sie versuchen zu tun ist nicht wirklich möglich, so, wie Sie es tun. Im Allgemeinen können MySQL Ansichten als scripted SELECT betrachtet werden. Die Ergebnisse einer Ansicht werden in der Datenbank nicht gespeichert von ihrer Quelle getrennt, sondern werden berechnet, wenn Sie auf die Ansicht verweisen.

Die meisten der Zeit, verwendet MySQL den MERGE-Algorithmus, wenn Sie aus einer Ansicht SELECT. Dies bedeutet, es die Definition Ihrer Ansicht und die SELECT-Anweisung verschmilzt sie zu der Ansicht, bezieht eine endgültige erstellen SELECT es tatsächlich läuft. Als solches kann man sich nicht wirklich eine Ansicht beziehen hat.

Ihre Optionen hier sind (1) eine zweite Ansicht zu definieren, die um den ersten Blick bezieht sich Ihre Summe zu erstellen, oder (2) schreiben die Summe Langschrift wie folgt aus:

('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top