MySQL Visualizzazioni: Riferimenti a un campo calcolato (per nome) in un altro campo calcolato
-
19-09-2019 - |
Domanda
Come posso definire una vista che ha due campi calcolati, per esempio ...
('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles
... e creare un terzo campo calcolato che si basa sui primi due campi calcolati, come in ...
('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes
...?
Quando ho riferisco i primi due campi calcolati in base al nome, ricevo un messaggio che i campi non sono note.
Grazie!
Soluzione
Dato sottoquery non sono ammessi in vista, è necessario per simulare loro creando più punti di vista.
Ad esempio, la query risolverà il problema se eseguito direttamente:
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;
Secondo vista la MySQL documentazione avere la restrizione di non essere in grado di contenere subquery nella clausola FROM. Per ovviare a questa limitazione e trasformare questa ricerca in una vista, suddividerlo in 3 visite (uno per ogni sottoquery) con l'ultima dare la desiderata combinazione di campi:
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;
Altri suggerimenti
... creare un terzo campo calcolato che si basa sui primi due campi calcolati ...
Come hai trovato, non è possibile fare riferimento colonne calcolate nella stessa SELECT. Le opzioni sono:
Duplica la logica
MySql non supporta subquery in vista per qualche strano motivo:
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
Crea livello Viste
Almeno opzione consigliata ...
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
Purtroppo, quello che stai cercando di fare in realtà non è possibile il modo in cui si sta facendo. In generale, viste MySQL può essere visto come un SELECT script. I risultati di una vista non vengono memorizzati sul database separato dalla loro fonte, ma sono piuttosto calcolati quando si fa riferimento alla vista.
La maggior parte del tempo, MySQL utilizza l'algoritmo MERGE quando si seleziona da una visualizzazione. Ciò significa che fonde la definizione della visualizzazione e l'istruzione SELECT riferendosi alla vista per creare un finale selezionarlo corre in realtà. In quanto tale, non si può davvero avere una vista riferirsi a se stesso.
Le opzioni qui sono a (1) definire una seconda vista che si riferisce al primo punto di vista, al fine di creare il tuo somma, oppure (2) scrivere la Longhand somma in questo modo:
('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes