MySQL Ansichten: Referenzierung eines berechnetes Feld (nach Namen) in einem anderen berechneten Feld
-
19-09-2019 - |
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!
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