我想從表中每個部門的部門編號,工資和其他各個欄目中找到兩個最高工資。我得到了這個答案;它肯定有效,但我無法理解邏輯。無法理解查詢
select *
from emp a where 2 > (select count(distinct(sal))
from emp
where sal > a.sal and a.deptno=deptno)
order by deptno;
我想從表中每個部門的部門編號,工資和其他各個欄目中找到兩個最高工資。我得到了這個答案;它肯定有效,但我無法理解邏輯。無法理解查詢
select *
from emp a where 2 > (select count(distinct(sal))
from emp
where sal > a.sal and a.deptno=deptno)
order by deptno;
對於員工的每一行,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名員工誰擁有更高的薪水比他們。
inner select返回給定員工的同一個部門中較高薪水的數量。現在,如果同一部門內的薪水不足兩個,那麼給定的員工必須是部門內最高收入或次高收入人員。
重新定位子查詢到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;
上面是更詳細的,但也許更容易遵循的邏輯。
絕對..只要你需要在兩個部分發起查詢...順便謝謝 – Birju
好吧,我不會提供我的回覆...非常相似! – Cris
其中'誰是誰是最快的答案按鈕'問題:) –
+1哦補了我寫了這樣一個很好的答案,太慢了:) – Mattis