Sql Oracle-可以优化此查询吗?

Sql Oracle-可以优化此查询吗?,sql,oracle,Sql,Oracle,我想获取一组行的最后日期。什么性能更好:查询1或查询2: 查询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 查询2 select column_date from table1 a join table2 b on a.column1=b.colu

我想获取一组行的最后日期。什么性能更好:查询1或查询2:

查询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
查询2

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

首先,您无法真正优化查询。查询总是由优化器重写的,根据数据量、索引等的不同,可能会给出非常不同的结果。因此,如果查询速度较慢,则必须查看执行计划以了解发生了什么。如果你有一个不慢的查询,你不应该优化它

从本质上说,子选择没有错。正如Wernfriend Domscheit所建议的,这将为您提供最短的列_日期,我假设它位于表2中

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 )
但是,如果列_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的最新版本中,可以使用
仅获取前1行
而不是
ROWNUM
查询。我不认为这有什么区别。

如果您使用的是Oracle 12,那么您可以使用第二个查询,并将
fetch first 1 row only
添加到它的末尾。否则,您必须再选择。为什么不从表1 a中选择MIN(column\u date)并在a.column1=b.column1上加入表2 b,其中id='1234'您是对的。实际上,我需要
选择max(column\u date)
而不需要
order by column\u date desc
当您的查询包含多个表时,请限定列。我说的是
id
。详细阐述了Wernfried Domscheit的答案:Oracle允许您在单个
select
语句中选择
max(column)
,即使没有
groupby
子句。SQL标准不允许这样做,但是添加
groupbynull
具有完全相同的效果,没有性能损失,并且符合SQL标准。