2013-03-03 2 views
0

Что делать, когда мы хотим выбрать зарплату сотрудника больше, чем многие (скажем, 12) зарплата сотрудников из таблицы. Я знаю, что мы должны использовать подзапрос, но писать его как: -О sql subquery

Select ename,salary 
from emp 
where salary>(select salary 
      from emp 
      where ename='A'||ename='B'.....) 

это может быть написано так, но его не хороший подход. Пожалуйста, предложите для этого полезный запрос.

ответ

1

Если вы знаете, 12 сотрудников, я думаю, что вы хотите, чтобы написать запрос, как:

Select ename,salary 
from emp 
where salary> (select max(salary) 
       from emp 
       where ename in ('A', 'B', . . .) 
      ) 

IN гораздо удобнее, чем связка из or заявлений. И подзапрос должен вернуть одно значение, максимальную зарплату.

+0

Большое спасибо ..... это сработало :) – Zeb

0

Это не точный код, который вы можете использовать, но он должен вам помочь.

Вы можете использовать функцию RANK().

Пример из article at oracle-base.com:

SELECT empno, 
     deptno, 
     sal, 
     RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank" 
FROM emp; 

    EMPNO  DEPTNO  SAL  rank 
---------- ---------- ---------- ---------- 
     7934   10  1300   1 
     7782   10  2450   2 
     7839   10  5000   3 
     7369   20  800   1 
     7876   20  1100   2 
     7566   20  2975   3 
     7788   20  3000   4 
     7902   20  3000   4 
     7900   30  950   1 
     7654   30  1250   2 
     7521   30  1250   2 
     7844   30  1500   4 
     7499   30  1600   5 
     7698   30  2850   6 
+0

Спасибо за ответ, но его больше как узнать оценки сотрудников. В моем случае я должен выбрать только тех сотрудников, у которых зарплата больше определенного количества сотрудников. – Zeb

1
Select ename,salary 
from emp 
where salary > (
    select salary 
    from 
     (
     select 
      salary, 
      rownum as rn 
     from emp 
     order by salary 
     ) 
    where rn = 12 
) 
0

Я вижу две разные интерпретации вашего требования.

1. Какие сотрудники зарабатывают больше, чем 12 других (случайных) сотрудников

и

2. Какие сотрудники зарабатывают больше, чем 12 конкретных сотрудников

Этот запрос решает первое требование , хотя он будет медленным, как черт на больших наборах данных.

select * 
    from emp a 
where 12 = (select count(*) 
       from emp b 
       where b.salary < a.salary); 

Этот запрос решает второе требование

select * 
    from emp 
where salary > all(select salary 
         from emp 
        where emp_id in(1,2,3,4,5) 
        ) 
+1

Для второго запроса, я думаю, вам понадобится разъяснение по требуемому поведению, если любой из перечисленных сотрудников имеет нулевую зарплату. –

+0

@DavidAldridge Хорошая точка! – Ronnis

+0

Хм, я думаю, что я просто нашел ошибку в оптимизаторе, когда экспериментировал с этим :) – Ronnis