Oracle:仅从具有 min(id) 的行中选择值

Rud*_*koŭ 5 sql oracle

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 
Run Code Online (Sandbox Code Playgroud)

它看起来很混乱,因为我有 6 个带条件的连接,我不想重复两次。还有另一种方法可以做到这一点吗?

MT0*_*MT0 6

使用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;
Run Code Online (Sandbox Code Playgroud)

您还可以使用RANK()

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

如果assessmentIdUNIQUE并且至少只能有一行,那么您可以替换RANKROW_NUMBER; 但是,您也可以使用伪列获得所需的结果ROWNUM

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