以这种方式编写 ROWNUM 和 ORDER BY 没有任何意义,因为 ORDER BY 是在 WHERE 子句之后评估的,这意味着它在这种情况下无效。这个问题给出了一个例子。
这也变得有点复杂,因为如果嵌套太深,很难将子查询连接回主查询。
下面的查询不一定有效,因为您不能以这种方式在 tbl 和 subtbl 之间加入。
SELECT
col1,
col2,
(
select colsub
from (
SELECT colsub
FROM subtbl
WHERE idsub = tbl.id
order by coldate
)
where rownum = 1
) as col3
FROM tbl
因此,您需要使用某种分析函数,如下例所示:
SELECT
col1,
col2,
(SELECT max(colsub) keep (dense_rank first order by coldate) as colsub
FROM subtbl
WHERE idsub = tbl.id
group by idsub
) col3
FROM tbl
FIRST
分析函数比它需要的复杂,但它会完成工作。
另一种选择是使用ROW_NUMBER
也可以解决问题的分析函数。
SELECT
col1,
col2,
(select colsub
from (
SELECT
idsub,
row_number() over (partition by idsub order by coldate) as rown,
colsub
FROM subtbl a
) a
WHERE a.idsub = tbl.id
and a.rown = 1
) col3
FROM tbl