在oracle中选择子查询的最高值

时间:2014-08-21 18:53:50

标签: sql oracle11g subquery

我有以下查询:

SELECT P.ID,
(
SELECT F.VALUE_ID FROM FORM F
INNER JOIN F.PERSON_ID = P.ID
) AS LATEST_FORM
FROM FORM F1 INNER JOIN PERSON P
ON P.ID = F1.PERSON_ID
WHERE F1.NO_PCP_IND IS NOT NULL
ORDER BY P.ID

每个人都可以有多种形式,我只是想获得他们提交的最新表格。我尝试在子查询中使用ROWNUM,我理解为什么它不起作用但不确定如何使用Oracle生成正确的结果集。

2 个答案:

答案 0 :(得分:2)

这是查询:

SELECT P.ID,
       (SELECT F.VALUE_ID
        FROM FORM F INNER JOIN
             F.PERSON_ID = P.ID
       ) AS LATEST_FORM
FROM FORM F1 INNER JOIN
     PERSON P
     ON P.ID = F1.PERSON_ID
WHERE F1.NO_PCP_IND IS NOT NULL
ORDER BY P.ID;

除了在语法上不正确之外,如果它工作,这将为每个人用户返回一行。我认为您的原始查询应该更像:

SELECT P.ID,
       (SELECT F.VALUE_ID
        FROM FORM F
        WHERE F1.NO_PCP_IND IS NOT NULL AND F.PERSON_ID = P.ID AND
              ROWNUM = 1
       ) AS LATEST_FORM
FROM PERSON P
ORDER BY P.ID;

这不能解决您的问题,因为您希望保留最后一个值。为此,请使用keep功能:

SELECT P.ID,
       (SELECT MAX(F.VALUE_ID) KEEP (DENSE_RANK FIRST ORDER BY XXX DESC)
        FROM FORM F
        WHERE F1.NO_PCP_IND IS NOT NULL AND F.PERSON_ID = P.ID
       ) AS LATEST_FORM
FROM PERSON P
ORDER BY P.ID;

在这种情况下,XXX是用于定义每个人的表单顺序的列的名称。

答案 1 :(得分:0)

我相信它是ValueId,它讲述了最新的表格

所以不会这么做吗?

  

SELECT max(F.VALUEID),P.ID   
从表格F,PERSON P   
其中F.PID = P.ID