2011-06-19 96 views
4

我想從表中每個部門的部門編號,工資和其他各個欄目中找到兩個最高工資。我得到了這個答案;它肯定有效,但我無法理解邏輯。無法理解查詢

select * 
from emp a where 2 > (select count(distinct(sal)) 
         from emp 
         where sal > a.sal and a.deptno=deptno) 
order by deptno; 

回答

5

對於員工的每一行,WHERE子句數有多少行具有在同一個部門有較高的收入中查詢。然後,WHERE子句本身將結果限制爲僅具有1或0行(2 >)在同一個部門的工資更高的工資 - 即最高的兩個工資。

所以用這個數據:

EmployeeId Sal DeptNo No. of rows in the same department with higher salary 
     1  1  1 3 (employees 2, 3 and 4) 
     2  2  1 2 (employees 3 and 4) 
     3  3  1 1 (employee 4) 
     4  4  1 0 
     5  1  2 2 (employees 6 and 7) 
     6  2  2 1 (employee 7) 
     7  3  2 0 

...查詢將選擇員工3,4,6,7,因爲他們是員工少於2名員工誰擁有更高的薪水比他們。

+1

好吧,我不會提供我的回覆...非常相似! – Cris

+1

其中'誰是誰是最快的答案按鈕'問題:) –

+0

+1哦補了我寫了這樣一個很好的答案,太慢了:) – Mattis

2

inner select返回給定員工的同一個部門中較高薪水的數量。現在,如果同一部門內的薪水不足兩個,那麼給定的員工必須是部門內最高收入或次高收入人員。

0

重新定位子查詢到SELECT條款沒有「頂部2」限制(顯然會得到更多的行回):

 select a.*, 
       (
       select count(distinct(sal)) 
        from emp 
       where sal > a.sal and a.deptno=deptno 
       ) as tally 
      from emp a 

可以使用一個WHERE子句引入另一層次例如然後限制結果集

select b.* 
    from (
     select a.*, 
       (
       select count(distinct(sal)) 
        from emp 
       where sal > a.sal and a.deptno=deptno 
       ) as tally 
      from emp a 
     ) b  
where b.tally < 2 
order 
    by b.deptno, b.tally; 

上面是更詳細的,但也許更容易遵循的邏輯。

+0

絕對..只要你需要在兩個部分發起查詢...順便謝謝 – Birju