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语句引用视图将它创建一个最终的选择实际上它运行。因此,你不能真正有一个看法是指本身。
这里使用的选项包括:(1)定义它指的是第一视图,以便第二视图来创建和,或(2)写出来的总和普通写法是这样的:
('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
不隶属于 StackOverflow