【问题标题】:Oracle: select values only from row with min(id)Oracle:仅从具有 min(id) 的行中选择值
【发布时间】:2026-02-02 02:00:01
【问题描述】:
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 个条件连接,我不想重复两次。还有另一种方法吗?

【问题讨论】:

标签: sql oracle


【解决方案1】:

使用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 并且至少只能有一行,那么您可以将RANK 替换为ROW_NUMBER;但是,您也可以使用 ROWNUM 伪列获得所需的结果:

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

【讨论】:

    【解决方案2】:

    使用带有 row_number 的 CTE

    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
    

    【讨论】:

    • 如果assessmentId 列是UNIQUE,则使用ROW_NUMBER 只会给出与OP 查询相同的答案。如果多行可以具有相同的最小值assessmentId,那么这将不会给出相同的答案。