Просмотры MySQL:Ссылка на одно вычисляемое поле (по имени) в другом вычисляемом поле.
-
19-09-2019 - |
Вопрос
Как я могу определить представление, которое имеет, например, два вычисляемых поля...
('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