2013-04-14 4 views
1

Я практикую Oracle подзапросов .. (Я новичок в Oracle.)потребность оракул запрос

Вопрос: Найти Высшую заработав Служащий в каждом департаменте?

Мой запрос ниже работ (но я чувствую его не так хорошо, даже если я получаю правильный результат)

select e.deptid, e.name, e.salary 
from employee e 
where e.salary = (select max(salary) 
        from employee b 
        where b.deptid = e.deptid) 

Есть еще один простой способ? (Использование внутренних соединений или каким-либо другим способом?)

И мне также интересно: когда именно мы должны использовать внутренние соединения вместо использования SubQueries? Когда нам нужно использовать SubQueries вместо Inner?

+0

ваш запрос _doesn't work_ за исключением случаев, когда много сотрудников имеют одинаковые зарплаты –

+0

, почему он не работает, имея больше сотрудников ?, BTW сотрудников и Департамент разные таблицы ... ли и знает любой другой способ написать запрос для вышеуказанного вопроса? – Irwin

+0

Это не дубликат предлагаемого дубликата ... он делает что-то совсем другое. –

ответ

1

Зачем использовать JOIN здесь?

select 
    deptid, 
    min(name) keep (dense_rank first order by salary desc), 
    max(salary) 
from 
    employee 
group by 
    deptid 
+0

i didnt получить это: min (name) keep (dense_rank первый заказ по зарплате desc), BTW, Есть ли какие-либо другой путь? – Irwin

0

я получил еще один запрос, как показано ниже:

select dept_id, fname,salary 
from (select dept_id, fname,salary, 
     rank() over (order by salary desc) ranking 
     from department d, employee e 
     where d.dept_id = e.deptid) where ranking=1; 

я чувствую выше правильно, но у меня есть сомнения в моем выше запросе: я не использовал любой играя в моем запросе Но все же я могу извлечь столбцы из 2 таблиц .. (так что не использовать соединения?)

+1

Вы не используете никаких данных из DEPARTMENT, так почему вы думаете, что вам нужно включить его в запрос? Но в любом случае ваш внутренний запрос имеет соединение, он просто использует другой синтаксис предложения WHERE, а не синтаксис ANSI 'join ... on'. – APC

0

Вы были близки - вам не хватает заказа по зарплате в rank

select * 
from ( 
    select dept_id , fname , salary , 
      rank() over (partition by dept_id order by salary) as rnk 
    from department d, employee e 
    where d.dept_id = e.deptid 
where rnk = 1