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!

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top