rownum vs max in oracle

时间:2017-11-03 12:04:46

标签: sql oracle

我有几个查询来获取最新修改的parent_id

max 关键字:

select max(parent_id)
from sample_table
where modified_date=(select max(modified_date) 
FROM sample_table
where id = 'test') and id = 'test';

使用 rownum 关键字:

select * 
from (
select parent_id,modified_date
from sample_table
where id = 'test' 
order by modified_date desc) 
WHERE  rownum <= 1 ;

两个查询都返回相同且正确的结果。

哪一个更好更快查询..

2 个答案:

答案 0 :(得分:1)

您的查询有些不可预测,因为两个记录可以具有相同的modified_date。因此,您必须应用技巧才能返回单行。

第一个查询是确定性的:它需要最新的modified_date;如果它返回多行,则需要具有最高parent_id的行。第二个查询是不可预测的:它取决于Oracle如何执行查询。

我会使用第二个查询并稍微修改它以使两个订单标准彼此接近:

select * 
from (
    select parent_id,modified_date
    from sample_table
    where id = 'test' 
    order by modified_date desc, parent_id desc) 
WHERE  rownum <= 1;

这种类型的查询也可以更好地扩展为返回更多列,即通过将其添加到内部SELECT子句。在另一个查询中,它更棘手。

答案 1 :(得分:1)

你会说最好的方法就是这个:

SELECT 
    MAX(parent_id) KEEP (DENSE_RANK FIRST ORDER BY modified_date desc, parent_id desc),    
    MAX(modified_date)
FROM sample_table
WHERE ID = 'test';