2014-05-01 37 views
0

我有一個表包含有關記錄的信息。每個記錄可以有幾個草稿。要查詢我目前正在進行的最高稿的信息:Oracle 10g - SQL - 優化查詢和遞歸調用

select 
    record_id, 
    record_name, 
    record_date 
from 
    RECSTABLE 
where 
    record_number = XXXXX 
    AND record_draft = (select max(record_draft) 
         from RECSTABLE 
         where record_number = XXXXX) 

這會返回正確的結果,但很麻煩。我想要做更高級的事情。

我有一個列表或record_numbers我想運行此查詢。問題是如何遞歸地做這件事,我該如何優化這個查詢?

感謝

+0

使用分析功能 - 使用ROW_NUMBER()來http://stackoverflow.com/questions/15234479/oracle-to-retrieve-maximum-record看到Bluefeet的答案 –

回答

1

怎麼是這樣的:

SELECT RECORD_ID, 
     RECORD_NAME, 
     RECORD_DATE 
    FROM RECSTABLE r 
    INNER JOIN (SELECT RECORD_NUMBER, 
        MAX(RECORD_DRAFT) AS MAX_RECORD_DRAFT 
       FROM RECSTABLE 
       GROUP BY RECORD_NUMBER) m 
    ON (m.RECORD_NUMBER = r.RECORD_NUMBER) 
    WHERE r.RECORD_NUMBER IN (xxxxx, yyyyy, zzzzz) AND 
     r.RECORD_DRAFT = m.MAX_RECORD_DRAFT; 

分享和享受。

2

不要使用分析功能這一點,但使用LAST聚合函數,因爲它是faster

事情是這樣的:

select max(record_id) keep (dense_rank last order by record_draft) record_id 
    , max(record_name) keep (dense_rank last order by record_draft) record_name 
    , max(record_date) keep (dense_rank last order by record_draft) record_date 
    from recstable 
where record_number = XXXXX 
group by record_number 
0

select record_id, record_name, record_date from ( select record_id, record_name, record_date , row_number() over ( partition by record_number order by record_draft desc ) as rn from RECSTABLE where record_number in (.....) ) where rn = 1