Сокращение вложенного SQL-запроса - PullRequest
3 голосов
/ 20 сентября 2011

Перечислите имена сотрудников, зарплата которых превышает среднюю зарплату отдела, в котором работает данный сотрудник.

Я предложил следующее решение: имена столбцов: emp_id, name, dept, salary в таблице с именем 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 ]

2 голосов
/ 20 сентября 2011

Этот запрос специфичен для Oracle, но его преимущество состоит в том, что он только один раз нажимает на таблицу employee:

select name from 
   (select name, 
           salary, 
           avg(salary) over (partition by dept) as avg_salary 
      from employee)
where salary > avg_salary;
2 голосов
/ 20 сентября 2011
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 

Попробуйте это

0 голосов
/ 20 сентября 2011

Возможно, не намного проще, но от 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   
0 голосов
/ 20 сентября 2011

обычно короткий или длинный запрос не должен быть в фокусе, но эффективный запрос должен быть в фокусе. Это может быть не по теме, но обеспечить правильную индексацию.

0 голосов
/ 20 сентября 2011

Нет, к сожалению, я думаю, что то, что у вас есть, настолько короткое и простое, насколько вы можете сделать это для достижения желаемого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...