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!

Foi útil?

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
scroll top