MySQL Views: Ссылка на одно вычисляемое поле (по имени) в другом вычисляемом поле.
Как я могу определить представление, которое имеет два вычисляемых поля, например...
('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles
... и создать третье вычисляемое поле, основанное на первых двух вычисляемых полях, как в...
('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes
...?
Когда я ссылаюсь на первые два вычисляемых поля по имени, я получаю сообщение, что поля неизвестны.
Спасибо!
3 ответа
Поскольку подзапросы недопустимы в представлениях, вам нужно будет смоделировать их, создав несколько представлений.
Например, этот запрос решит вашу проблему, если выполняется напрямую:
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, который он фактически выполняет. Таким образом, вы не можете иметь вид, ссылающийся на себя.
Ваши варианты здесь: (1) определить второе представление, которое ссылается на первое представление для создания вашей суммы, или (2) выписать сумму от руки так:
('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes