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

Sql 选择oracle中子查询的最高值,sql,oracle11g,subquery,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,我理

我有以下疑问:

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生成正确的结果集。

我相信是
ValueId
讲述了最新的表单

这不管用吗

选择最大值(F.VALUEID)、p.ID
来自表格F,个人P
其中F.PID=P.ID

以下是查询:

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
是定义每个人表格顺序的列的名称。

您如何知道哪个是最新的表格?是否有任何字段指示订单?谢谢Gordon,我以前从未见过KEEP函数。