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

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

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

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

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

...?

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

Спасибо!


person Alan M.    schedule 13.12.2009    source источник


Ответы (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;
person Adam Franco    schedule 13.12.2009
comment
Если вы попробуете это, вы увидите, что это вызывает ошибку SQL. Это связано с тем, что оператор SELECT не может содержать подзапрос в предложении FROM. См.: dev.mysql.com/doc/refman/5.0/ ru/create-view.html - person Conspicuous Compiler; 13.12.2009
comment
Я заметил это, когда проверял свой первоначальный ответ. Я обновил его, чтобы использовать несколько представлений для имитации подзапросов. - person Adam Franco; 13.12.2009
comment
Спасибо, что приложили столько усилий для этого. Я признателен за это. - person Alan M.; 13.12.2009

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

Как вы обнаружили, вы не можете ссылаться на вычисляемые столбцы в одном и том же 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
person OMG Ponies    schedule 13.12.2009

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

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

Ваши варианты здесь: (1) определить второе представление, которое ссылается на первое представление, чтобы создать вашу сумму, или (2) записать сумму от руки, как это:

('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
person Conspicuous Compiler    schedule 13.12.2009