日前在做一個SQL練習,有提到如何去取出某欄位的值是第二大的所有欄位資料,且如果有
多筆的話也要一起列出 (表示有相等的第二大值)。
SQL語法使用環境為:SQL Server 2008 R2
table資料如下:
從該table看來,Salary第二大的值為50000,因此要如何列出這兩列的資料?
一、考慮如何排除最大的value該欄位
如果你在正常的table下使用MAX(Salary),勢必只會取得Salary = 80000的資料
如何排除掉這筆資料? 可以使用子查詢的觀念
即你的table過濾條件是以另一個table塞選出的data為過濾,如下面的語法,搭配NOT IN使用
,排除最大MAX(Salary)的value
排除掉80000該筆資料,那麼剩下最大的即為50000
二、如何取得所有欄位的資料且Salary相等的也要考慮
由上面可以得知,若在欄位使用了該彙總函數
就無法列出其它的欄位(以上面的語法看來),只會得到單筆資料及單一一個欄位
這時我又想到子查詢的觀念,若50000已經是我們要的了,那我們就再以該結果為塞選條件
在外層下一個新的SELECT,如下:
如此一來就會得到下面的結果:
多筆的話也要一起列出 (表示有相等的第二大值)。
SQL語法使用環境為:SQL Server 2008 R2
table資料如下:
一、考慮如何排除最大的value該欄位
如果你在正常的table下使用MAX(Salary),勢必只會取得Salary = 80000的資料
SELECT MAX(Salary) FROM Employees
如何排除掉這筆資料? 可以使用子查詢的觀念
即你的table過濾條件是以另一個table塞選出的data為過濾,如下面的語法,搭配NOT IN使用
,排除最大MAX(Salary)的value
SELECT MAX(Salary) FROM Employees
where
Salary NOT IN(Select MAX(Salary) FROM Employees)
排除掉80000該筆資料,那麼剩下最大的即為50000
二、如何取得所有欄位的資料且Salary相等的也要考慮
由上面可以得知,若在欄位使用了該彙總函數
就無法列出其它的欄位(以上面的語法看來),只會得到單筆資料及單一一個欄位
這時我又想到子查詢的觀念,若50000已經是我們要的了,那我們就再以該結果為塞選條件
在外層下一個新的SELECT,如下:
SELECT * FROM Employees
WHERE
Salary IN (
SELECT MAX(Salary) FROM Employees
where
Salary NOT IN(Select MAX(Salary) FROM Employees)
)
新的SELECT將列出所有的欄位,條件為該Salary滿足50000的該筆!如此一來就會得到下面的結果:
感覺就是在做巢狀子查詢一樣XD
留言
張貼留言