2010-11-27 3 views
1

커서를 반환하는 저장 프로 시저가 있습니다.Oracle Pl/sql은 여러 쿼리에서 하나의 커서를 반환합니다.

응용 프로그램은 얼마나 많은 ID를 가져와야하는지 결정하는 프로 시저에 매개 변수를 전달하므로 프로시 저는 그 번호의 시간을 알 수 없습니다.

foreach ID 해당 ID를 사용하여 상위 3 개 레코드를 가져와야합니다. 내가 사용하려고 무엇을 :

select * from table_name where id in (List of ID`s); 

그 쿼리가 작동하지만 각 ID의 상위 3 개를 얻을 캔트. 내가 결과 카운트를 제한하면, 나는 첫 번째 ID의 TOP 결과를 얻을 것이다.

For 루프를 사용하여 각 ID에 대한 쿼리를 실행하고 커서에 결과를 추가한다고 생각했지만 이해는 불가능합니다.

어떤 아이디어?

더 상세 제가 5 ID s and each of them have inner Id S가 있다고 가정하자 그래서 ID 1 갖는다 (1,2,3,4,5) ID 2 (1,2,3,4,5) 이드 3 (12,14,15,16,22) 이드 4 (2,3,5,7,9) 이드 5 (4,7,8,9,10) 이 경우, , 나는 행 번호가 나를 도울 방법을 보지 않는다. 각 ID에 대해 상위 3 개가 필요합니다.이 경우 커서에 15 개의 결과가 있어야합니다.

10 배 많이하고 좋은 주말을 가지고)

아마도

답변

5

당신이 세 가지를 결정하는 몇 가지 기준을 가지고?

어쨌든이 목표를 달성하는 방법은 분석 기능을 사용하는 것입니다. 오라클은 ROW_NUMBER(), RANK() 및 DENSE_RANK()의 세 가지 기능을 제공합니다. 이들은 TOP 3의 3 가지 약간 다른 해석을 제공합니다. Find out more.

다음은 ROW_NUMBER()를 사용하여 각 ID에 정확히 3 개의 행을 반환하는 기본 개념입니다. ROW_NUMBER() 절에 whatever

open rc for 
    select * from (
     select t.* 
       , row_number() over (partition by id order by whatever) rn 
     from table_name t 
     where t.id in (List of ID`s) 
    ) 
    where rn <= 3; 

는 TOP-다움을 결정하는 데 사용하는 열입니다. 갈

+0

ID의 각성에 대해 상위 3 개를 결정하는 방법이 있습니다. –

+0

@Udi l : 분석/순위 지정/윈도우 함수의 'PARTITION BY id'부분에서 수행하는 작업 (이 경우 ROW_NUMBER)입니다. –

+0

당신은 완벽하게 작동합니다. 정확하게 필요한 것입니다. 10 배. –

-2

또 다른 아이디어는 오라클 임시 테이블

Link to more information

create global temporary table temp_table_name 
을 정의하는 것 그 다음에 당신이 필요한 모든 ID의 임시 테이블에 행을 삽입 할 수있는 for 루프. 리턴 된 커서는 임시 테이블의 내용이됩니다. 물론이 솔루션은 단일 SQL 쿼리에서 결과를 다시 얻을 수없는 경우에만 의미가 있습니다.

+0

이 쿼리의 성능은 매우 중요하며 shoud는 가능한 가장 빠른 방식으로 실행된다는 점을 강조하고 싶습니다. 10x :) –

+1

단일 쿼리에서 결과를 다시 얻을 수 있으므로 글로벌 임시 테이블은 불필요한 오버 헤드입니다. – APC

관련 문제