缩短嵌套SQL查询

时间:2011-09-20 17:46:01

标签: mysql oracle database

列出薪水大于给定员工所在部门的平均工资的员工姓名。

我推出了以下解决方案: 列名称为: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')
;

我可以将此查询缩短一点,期望得到相同的结果吗?

5 个答案:

答案 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)

通常短或长的查询不应该是焦点,但有效的查询应该是焦点。 这可能是偏离主题的,但要确保正确编制索引。