MySQL Vistas: Hacer referencia a un campo calculado (por nombre) en otro campo calculado
-
19-09-2019 - |
Pregunta
¿Cómo puedo definir una vista que tiene dos campos calculados, por ejemplo ...
('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles
... y crear un tercer campo calculado que se basa en los dos primeros campos calculados, como en ...
('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes
...?
Cuando me refiero a los dos primeros campos calculados por su nombre, aparece un mensaje de que los campos son desconocidos.
Gracias!
Solución
Desde subconsultas no están permitidos en las vistas, necesitará para simular mediante la creación de múltiples puntos de vista.
Por ejemplo, esta consulta va a resolver su problema si se ejecuta directamente:
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;
De acuerdo con la documentación vistas MySQL tener la restricción de no ser capaz de contener subconsultas en la cláusula FROM. Para evitar esta limitación y convertir esta consulta en una vista, dividirla en 3 vistas (una para cada subconsulta) con el último que da la combinación deseada de campos:
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;
Otros consejos
... crear un tercer campo calculado que se basa en los dos primeros campos calculados ...
A medida que ha encontrado, no se puede hacer referencia a columnas calculadas en el mismo SELECT. Sus opciones son:
Duplicar la lógica
MySQL no soporta subconsultas en las vistas por alguna razón extraña:
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
Capa las Vistas
opción menos recomendable ...
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
Por desgracia, lo que estamos tratando de hacer no es realmente posible la forma en que lo está haciendo. En general, los puntos de vista de MySQL pueden ser vistos como un SELECT guión. Los resultados de un punto de vista no se almacenan en la base de datos separada de su fuente, sino más bien se calculan cuando se hace referencia a la vista.
La mayoría de las veces, MySQL utiliza el algoritmo MERGE Cuando se selecciona desde un punto de vista. Esto significa que se fusiona la definición de la vista y la instrucción SELECT en referencia a la vista para crear una final SELECCIONAR que realmente funciona. Como tal, realmente no se puede tener una visión se refiere a sí mismo.
Sus opciones aquí son: (1) definir un segundo punto de vista, que se refiere a la primera vista con el fin de crear su suma, o (2) escribir la escritura corriente suma de esta manera:
('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes