我有一个存储过程,它返回一个游标。
应用程序将一个参数传递给过程,该过程确定应该获取多少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)Id 3(12,14,15,16,22)Id 4(2,3,5,7) ,9)Id 5(4,7,8,9,10)
在这种情况下,我正在处理的情况,我不知道行号将如何帮助我。
我需要每个ID的前3个,在这种情况下,光标应该有15个结果。
10x很多,周末愉快;)
答案 0 :(得分:5)
据推测,你有一些确定前三名的标准?
无论如何,实现这一目标的方法是使用分析功能。 Oracle提供三种不同的功能:ROW_NUMBER(),RANK()和DENSE_RANK()。这些对TOP 3提出了三种不同的解释。Find out more。
这是基本的想法,使用ROW_NUMBER(),它将为每个ID返回三行。
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;
ROW_NUMBER()子句中的whatever
是用于确定TOP-ness的列。
答案 1 :(得分:-2)
另一个想法是定义一个Oracle临时表
create global temporary table temp_table_name
然后在for循环中,您可以将行插入临时表中以获取所有需要的ID。然后返回的光标将是临时表的内容。当然,只有在无法从单个sql查询中获取结果时,此解决方案才有意义