查询是:
select employee_id
, last_name
, salary
, round((salary+(salary*0.15)), 0) as "NewSalary"
, (round((salary+(salary*0.15)), 0) - salary) as “IncreaseAmount”
from employees;
我是否可以优化此round((salary+(salary*0.15)), 0)
部分,以便它不会出现两次?我尝试给它一个别名,但没有用:(
答案 0 :(得分:7)
要进行一次计算,请执行以下操作:
SELECT employee_id,
last_name,
salary,
NewSalary,
(NewSalary - salary) as “IncreaseAmount”
FROM (Select employee_id,
last_name,
salary,
round(salary*1.15, 0) as NewSalary
FROM employees)
您不能在别名中使用别名作为邻居,但您可以在嵌套选择中对其进行别名,并使用该视图的结果两次,但效率更高,因为它只进行一次计算。
答案 1 :(得分:1)
您是否尝试过ROUND(薪水* 1.15)?
答案 2 :(得分:1)
最佳优化只是从查询中删除IncreaseAmount
。
您无需从数据库查询中返回新旧薪水之间的差异,如果需要,可以轻松计算。在查询中进行计算只意味着即使不需要也可以进行计算,并且查询结果会比查询结果大。
答案 3 :(得分:0)
您不能在同一级别使用列别名。
使用子查询作为尼克克拉弗建议将带来自己的惩罚(执行时间最终可比较,所以优化是有问题的。)
使用计算列进行查看可能会对其进行一些优化,但不会大幅度优化(再次可比较)。
如果(select)性能非常重要,那么你必须对其进行非规范化并将新薪水写入某处,然后通过触发器或应用程序逻辑层维护完整性。