MySQL Visualizações: Referenciar um campo calculado (por nome) em um outro campo calculado
-
19-09-2019 - |
Pergunta
Como posso definir uma exibição que tem dois campos calculados, por exemplo ...
('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles
... e criar um terceiro campo calculado que é baseado nos dois primeiros campos calculados, como em ...
('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes
...?
Quando eu referenciar os dois primeiros campos calculados por nome, eu recebo uma mensagem de que os campos são desconhecidos.
Obrigado!
Solução
Desde subconsultas não são permitidas nas vistas, você vai precisar para simular-los através da criação de vários pontos de vista.
Por exemplo, esta consulta vai resolver o seu problema se diretamente executado:
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 acordo com vistas a href="http://dev.mysql.com/doc/refman/5.0/en/create-view.html" rel="nofollow noreferrer"> MySQL documentação têm a restrição de não ser capaz de conter subconsultas na cláusula FROM. Para contornar essa limitação e transformar esta consulta em uma exibição, dividi-lo em 3 vistas (um para cada subconsulta), com a última dar a combinação desejada 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;
Outras dicas
... criar um terceiro campo calculado que é baseado nos dois primeiros campos calculados ...
Como você encontrou, você não pode referenciar colunas na mesma SELECIONAR calculado. Suas opções são:
Duplicar a lógica
MySQL não suporta subconsultas em vistas por algum motivo estranho:
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
Camada as vistas
Menos opção recomendada ...
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
Infelizmente, o que você está tentando fazer não é realmente possível a maneira que você está fazendo isso. Geralmente, visões de MySQL pode ser visto como um SELECT script. Os resultados de um ponto de vista não são armazenados no banco de dados separado de sua fonte, mas são bastante calculado quando se referem à vista.
Na maioria das vezes, MySQL usa o algoritmo MERGE quando você seleciona a partir de um ponto de vista. Isso significa que ele se funde a definição do seu ponto de vista e a instrução SELECT referindo-se ao ponto de vista, para criar um SELECT final, ele realmente funciona. Como tal, você não pode realmente ter uma visão referem-se a si mesmo.
As suas opções aqui são: (1) definir um segundo ponto de vista que se refere à primeira vista, a fim de criar o seu soma, ou write (2) a escrita comum soma assim:
('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes