我正在使用Oracle Database 10g Enterprise Edition 10.2.0.4.0 64bit
我想知道,编写以下查询的最佳方法是什么?
1。使用rownum
SELECT * FROM
(
SELECT ID_DONNEE_H, DATE_DONNEE
FROM DONNEE_H d
WHERE d.DATE_DONNEE > sysdate -50000
AND d.ID_SC = 38648
ORDER BY DATE_DONNEE DESC
)
WHERE rownum=1;
2。使用WITH
条款
with req as (
select d.ID_DONNEE_H, row_number() over (order by DATE_DONNEE desc) as seqnum
from DONNEE_H d
where d.DATE_DONNEE > sysdate -50000
AND d.ID_SC = 38648 )
select * from req where seqnum = 1;
第3。使用排名条款
select * from (select d.ID_DONNEE_H, row_number() over (order by DATE_DONNEE desc) as seqnum
from DONNEE_H d
where d.DATE_DONNEE > sysdate -50000
AND d.ID_SC = 38648) test
where seqnum = 1;
我认为2和3是相似的,但哪个是最快的,1,2或3?
答案 0 :(得分:0)
我不认为你可以特别概括哪个查询是最好的"在所有情况下。与大多数IT问题一样,答案是:"它取决于"!您需要根据自己的优点调查每个查询。
顺便说一下,你错过了另一种选择 - 假设你只是在一个专栏之后,而不是你感兴趣的最高专栏的整行:
with sample_data as (select 10 col1, 3 col2 from dual union all
select 20 col1, 3 col2 from dual union all
select 30 col1, 1 col2 from dual union all
select 40 col1, 2 col2 from dual)
select max(col1) keep (dense_rank first order by col2 desc) col1_val_of_max_col2
from sample_data;
COL1_VAL_OF_MAX_COL2
--------------------
20