Просмотры MySQL:Ссылка на одно вычисляемое поле (по имени) в другом вычисляемом поле.

StackOverflow https://stackoverflow.com/questions/1895500

Вопрос

Как я могу определить представление, которое имеет, например, два вычисляемых поля...

 ('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles

...и создайте третье вычисляемое поле, основанное на первых двух вычисляемых полях, как в...

 ('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes

...?

Когда я ссылаюсь на первые два вычисляемых поля по имени, я получаю сообщение о том, что поля неизвестны.

Спасибо!

Это было полезно?

Решение

Поскольку подзапросы в представлениях не допускаются, вам нужно будет смоделировать их, создав несколько представлений.

Например, этот запрос решит вашу проблему, если он будет выполнен напрямую:

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;

Согласно Документация MySQL Представления имеют ограничение на невозможность содержать подзапросы в предложении FROM.Чтобы обойти это ограничение и превратить этот запрос в представление, разбейте его на 3 представления (по одному для каждого подзапроса), последнее из которых дает желаемую комбинацию полей:

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;

Другие советы

...создайте третье вычисляемое поле, основанное на первых двух вычисляемых полях...

Как вы обнаружили, вы не можете ссылаться на вычисляемые столбцы в одном и том же SELECT.Ваши варианты:

Дублируем логику

MySQL не поддерживает подзапросы в представлениях по какой-то странной причине:

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

Наслаивайте представления

Наименее рекомендуемый вариант...

 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

К сожалению, то, что вы пытаетесь сделать, на самом деле невозможно так, как вы это делаете.Обычно представления MySQL можно рассматривать как сценарий SELECT.Результаты представления не сохраняются в базе данных отдельно от их источника, а вычисляются при обращении к представлению.

Большую часть времени MySQL использует алгоритм MERGE, когда вы ВЫБРАЕТЕ из представления.Это означает, что он объединяет определение вашего представления и оператор SELECT, ссылающийся на представление, для создания окончательного SELECT, который он фактически запускает.Таким образом, вы не можете заставить VIEW ссылаться на самого себя.

Здесь вы можете (1) определить второе представление, которое ссылается на первое представление, чтобы создать сумму, или (2) записать сумму от руки следующим образом:

('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top