这一定是一件非常容易的事情,但我无法完成任务,也无法在任何地方找到这样的问题.这就是我的select代码:
SELECT *,
(SELECT SUM(x) FROM a WHERE (...)) AS sum_x,
(SELECT SUM(y) FROM b WHERE (...)) AS sum_y
FROM table
Run Code Online (Sandbox Code Playgroud)
我想创建一个更多的领域(sum_x - sum_y),但当我尝试做这样的事情
SELECT *,
(SELECT SUM(x) FROM a WHERE (...)) AS sum_x,
(SELECT SUM(y) FROM b WHERE (...)) AS sum_y,
(sum_x - sum_y) AS sum_c
FROM table
Run Code Online (Sandbox Code Playgroud)
它对我生气并说Unknown column 'sum_x' in 'field list'.
我在这里失踪了什么?
SQL通常不允许您在定义它们的同一级别引用列别名.您需要使用子查询执行此操作:
select t.*, (sum_x - sum_y) as sum_c
from (SELECT *,
(SELECT SUM(x) FROM a WHERE (...)) AS sum_x,
(SELECT SUM(y) FROM b WHERE (...)) AS sum_y
FROM table
) t;
Run Code Online (Sandbox Code Playgroud)
但是,MySQL倾向于实现子查询,因此存在性能损失.实现的开销可能比两次执行子查询计算要少:
SELECT *,
(SELECT SUM(x) FROM a WHERE (...)) AS sum_x,
(SELECT SUM(y) FROM b WHERE (...)) AS sum_y,
((SELECT SUM(x) FROM a WHERE (...)) -
(SELECT SUM(y) FROM b WHERE (...))
) as sum_c
FROM table;
Run Code Online (Sandbox Code Playgroud)
仅进行一次计算也更容易维护和理解.
在MySQL中,您也可以这样做:
SELECT *,
@sum_x := (SELECT SUM(x) FROM a WHERE (...)) AS sum_x,
@sum_y := (SELECT SUM(y) FROM b WHERE (...)) AS sum_y,
(@sum_x - @sum_y) as sum_c
FROM table cross join
(select @sum_x := 0, @sum_y := 0) const
Run Code Online (Sandbox Code Playgroud)
MySQL不保证在赋值后评估最后一个表达式.它似乎在实践中始终这样做.
| 归档时间: |
|
| 查看次数: |
37 次 |
| 最近记录: |