列出薪水大于给定员工所在部门的平均工资的员工姓名。
我推出了以下解决方案: 列名称为:emp_id,name,dept,名为employee的表中的工资。
select name from employee
where salary >
(
select avg(salary) from employee
where dept= (select dept from employee where emp_id = 'a10')
)
and
dept = (select dept from employee where emp_id = 'a10')
;
我可以将此查询缩短一点,期望得到相同的结果吗?
答案 0 :(得分:2)
select name from employee e1
join
(
select dept, avg(salary) avg_sal
from employee e2
where emp_id = 'a10'
group by dept
) e2
on e2.dept = e1.dept and
e1.salary > e2.avg_sal
试试
答案 1 :(得分:2)
此查询是特定于Oracle的,但它的优点是只能访问employee
表一次:
select name from
(select name,
salary,
avg(salary) over (partition by dept) as avg_salary
from employee)
where salary > avg_salary;
答案 2 :(得分:0)
不,不幸的是,我认为你所拥有的只是简短而简单,因为你可以实现你想要的结果。
答案 3 :(得分:0)
可能不是更简单但是从3到2个查询:
SELECT e3.name FROM employee e3
INNER JOIN (
SELECT e1.dept, AVG(e1.salary) avg_salary
FROM employee e1 INNER JOIN employee e1 ON e1.dept = e2.dept AND e2.emp_id='a10'
GROUP BY e1.dept
) t ON t.dept = e3.dept AND e3.salary > avg_salary
非常确定我可以通过将嵌套查询替换为另一个连接来将其降低到1。
也许试试这个:
SELECT e1.name
FROM employee e1
INNER JOIN employee e2 ON e2.dept = e1.dept
INNER JOIN employee e3 ON e2.dept = e3.dept AND e3.emp_id='a10'
GROUP BY e1.name
HAVING AVG(e2.salary) > e1.salary
答案 4 :(得分:0)
通常短或长的查询不应该是焦点,但有效的查询应该是焦点。 这可能是偏离主题的,但要确保正确编制索引。