Sql Oracle-可以优化此查询吗?
我想获取一组行的最后日期。什么性能更好:查询1或查询2: 查询1Sql 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
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标准。