Oracle 10g - SQL - 以递归方式优化查询和调用

时间:2014-05-01 10:21:03

标签: sql oracle

我有一个包含记录信息的表。每条记录可以有几个草稿。要查询我目前所做的最高草稿的信息:

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)

这会返回正确的结果,但这很麻烦。我想做一些更先进的事情。

我有一个列表或记录编号,我想运行此查询。问题是如何递归地执行此操作,如何优化此查询?

由于

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分: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

相关问题