我想获取一组行的最后一个日期。性能更好的是:Query1或Query2:
查询1
select *
from(
select column_date
from table1 a join table2 b on a.column1=b.column1
where id= '1234'
order by column_date desc) c
where rownum=1
Query2
select column_date
from table1 a join table2 b on a.column1=b.column1
where id= '1234'
order by column_date desc
并在后端获取第一行。
或者也许还有另一种方法可以在Oracle中取得第一行?我知道通常子选择的表现不佳。这就是为什么我要删除子选择的原因。
我尝试过,但是没有得到预期的结果:
select column_date
from table1 a join table2 b on a.column1=b.column1
where id= '1234' and rownum=1
order by column_date desc
答案 0 :(得分:1)
首先,您无法真正优化查询。查询始终由优化器重写,并且根据存在的数据量,索引等,查询可能会给出非常不同的结果。因此,如果查询速度很慢,则必须查看执行计划以查看发生的情况。而且,如果您查询的速度不慢,则不应该对其进行优化。
本质上,子选择没有问题。正如Wernfriend Domscheit所建议的那样,这将为您提供最小的column_date,我认为它位于table2中。
SELECT MIN( b.column_date )
FROM table1 a
INNER JOIN table2 b on a.column1 = b.column1
WHERE a.id= '1234'
可以保证只给您一行。如果您不仅需要日期字段,还可以选择日期最少的行:
SELECT a.*, b.column_date
FROM table1 a
INNER JOIN table2 b on a.column1 = b.column1
WHERE a.id= '1234'
AND b.column_date = ( SELECT MIN( b2.column_date ) FROM table2 b2 )
但是,如果您的column_date不是唯一的,则可能会返回多行。如果可能的话,您将需要在数据中添加一些内容来区分要选择的行。这样可以保证单行:
SELECT * FROM (
SELECT a.*, b.column_date
FROM table1 a
INNER JOIN table2 b on a.column1 = b.column1
WHERE a.id= '1234'
AND b.column_date = ( SELECT MIN( b2.column_date ) FROM table2 b2 )
ORDER BY a.some_other_column
)
WHERE ROWNUM = 1
在最新版本的Oracle中,您可以使用FETCH FIRST 1 ROW ONLY
代替ROWNUM
查询。我认为这没有什么影响。