【问题标题】:MySQL Views: Referencing one calculated field (by name) in another calculated fieldMySQL 视图:在另一个计算字段中引用一个计算字段(按名称)
【发布时间】:2009-12-13 03:56:42
【问题描述】:

如何定义一个具有两个计算字段的视图,例如...

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

...并基于前两个计算字段创建第三个计算字段,如...

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

...?

当我按名称引用前两个计算字段时,我收到一条消息,指出这些字段是未知的。

谢谢!

【问题讨论】:

    标签: sql mysql calculated-columns sql-view


    【解决方案1】:

    由于视图中不允许子查询,您需要通过创建多个视图来模拟它们。

    例如,如果直接执行此查询将解决您的问题:

    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 documentation 视图有不能在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;
    

    【讨论】:

    • 如果你尝试这个,你会发现它会导致一个 SQL 错误。这是因为“SELECT 语句不能在 FROM 子句中包含子查询”。见:dev.mysql.com/doc/refman/5.0/en/create-view.html
    • 我在测试我的初始答案时注意到了这一点。我已经更新它以使用多个视图来模拟子查询。
    • 感谢您为此付出了如此多的努力。我很感激。
    【解决方案2】:

    ...创建基于前两个计算字段的第三个计算字段...

    正如您所发现的,您不能在同一个 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
    

    【讨论】:

      【解决方案3】:

      不幸的是,您尝试做的事情实际上不可能按照您的方式进行。通常,MySQL 视图可以看作是一个脚本化的 SELECT。视图的结果不会与其源分开存储在数据库中,而是在您引用该视图时进行计算。

      大多数时候,当您从视图中选择时,MySQL 使用 MERGE 算法。这意味着它将您的视图的定义和引用它的视图的 SELECT 语句合并,以创建它实际运行的最终 SELECT。因此,您不能真正让 VIEW 引用自身。

      您的选择是 (1) 定义第二个视图,该视图引用第一个视图以创建您的总和,或者 (2) 像这样写出总和:

      ('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
      

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 2017-10-16
        相关资源
        最近更新 更多