2010-11-27 3 views
1

カーソルを返すストアドプロシージャがあります。Oracle Pl/sqlは複数のクエリから1つのカーソルを返します

アプリケーションは、取得する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秒を持っていると言うことができますので イド1は(1,2,3,4,5)IDが2(1,2,3,4,5)同上3 (12,14,15,16,22)Id 4(2,3,5,7,9)Id 5(4,7,8,9,10) このケースでは、私は行番号が私を助ける方法を見ていない。 IDごとにトップ3が必要です。この場合、カーソルには15の結果が必要です。

10倍たくさんと良い週末を持っている;)

答えて

5

おそらくあなたがトップ3を決定するためのいくつかの基準を持っていますか?

とにかく、この目的を達成する方法は、分析関数を使用することです。 Oracleは、ROW_NUMBER()、RANK()およびDENSE_RANK()の3つの異なる機能を提供します。これらはTOP 3の3つのわずかに異なる解釈を提供します。Find out more

ROW_NUMBER()を使用する基本的な考え方は、IDごとに正確に3つの行を返します。 ROW_NUMBER()句で

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; 

whateverあなたはTOPネスを決定するために使用する列です。一緒に行くために

+0

私は各IDのセパレーションの上位3を決定する方法があります。 –

+0

@Udi l:これは、分析/ランキング/ウィンドウ関数の 'PARTITION BY id'部分(この場合はROW_NUMBER)と同じです。 –

+0

ソルーションは完璧に動作します。私が必要とするものです。 10倍。 –

-2

もう一つのアイデアは、その後、ループのためにあなたが必要なすべてのIDのために一時テーブルに行を挿入することができますOracleの一時テーブルに

create global temporary table temp_table_name 

Link to more information

を定義することです。返されるカーソルは、一時表の内容になります。もちろん、この解決策は、単一のSQLクエリから結果を返すことが不可能な場合にのみ意味があります。

+0

このクエリのパフォーマンスは重要であり、可能なかぎり最速で実行されることを強調したいと思います。 10x :) –

+1

結果を単一の問合せから戻すことは完全に可能であるため、グローバル一時表は不要なオーバーヘッドです。 – APC

関連する問題