2017-08-09 60 views
1
SELECT 
    ass.assessmentAmount -- want to fetch assessmentAmount of min(ass.assessmentId) 
    ass.assessmentId 
FROM 
    --bunch of joins 
WHERE 
ass.assessmentId = (SELECT min(ass2.assessmentId) FROM Assessment ass2 
    --same bunch of joins 

它看起來很混亂,因爲我有6個連接條件,我不想重複兩次。有沒有另外一種方法呢?Oracle:僅從最小行數中選擇數值(id)

+0

的[使用having子句中的MIN功能(可能的複製https://stackoverflow.com/questions/19761714/using-the:不過,你也可以再使用ROWNUM虛列獲得所需的結果-min-function-in-the-having-clause) – NikNik

回答

3

使用MIN(ass.assessmentId) OVER()解析函數:

SELECT * 
FROM (
    SELECT ass.assessmentAmount, 
     ass.assessmentId, 
     MIN(ass.assessmentId) OVER() AS min_assessmentId 
    FROM --bunch of joins 
) 
WHERE assessmentId = min_assessmentId; 

您還可以使用RANK()

SELECT * 
FROM (
    SELECT ass.assessmentAmount, 
     ass.assessmentId, 
     RANK() OVER (ORDER BY ass.assessmentId) AS rnk 
    FROM --bunch of joins 
) 
WHERE rnk = 1; 

如果assessmentIdUNIQUE,只能然後至少有一行你可以用ROW_NUMBER代替RANK;

SELECT * 
FROM (
    SELECT ass.assessmentAmount, 
     ass.assessmentId 
    FROM --bunch of joins 
    ORDER BY ass.assessmentId ASC 
) 
WHERE ROWNUM = 1; 
1

使用CTE與ROW_NUMBER

with CTE as 
(
select assessmentId, 
     assessmentAmount , 
     row_number() over (order by assessmentid asc) as rn 
from --bunch of joins 
) 
select * 
from CTE 
where rn = 1 
+0

如果'assessmentId'列是'UNIQUE',那麼使用'ROW_NUMBER'只會給出與OP的查詢相同的答案。如果多行可以具有相同的最小「評估ID」,那麼這不會給出相同的答案。 – MT0