【问题标题】:Oracle Pl/sql return one cursor from multiple queriesOracle Pl/sql 从多个查询中返回一个游标
【发布时间】:2010-11-27 17:12:43
【问题描述】:

我有一个存储过程,它返回一个游标。

应用程序将一个参数传递给确定应该获取多少 ID 的过程,因此该过程不知道该数字的时间头。

foreach ID 我需要获取具有该 ID 的前 3 条记录。 我尝试过的是使用:

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

该查询有效,但我无法获得每个 ID 的前 3 个。如果我限制结果数,我会得到第一个ID的TOP结果。

我认为使用 For 循环,对每个 ID 执行查询并将结果附加到光标,但据我了解这是不可能的。

有什么想法吗?

更多详情 假设我有 5 个 IDs and each of them have inner Ids 所以 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 个结果。

10 倍,周末愉快 ;)

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    大概你有一些确定前三名的标准?

    无论如何,实现这一目标的方法是使用解析函数。 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 的列。

    【讨论】:

    • 我有办法分别确定每个 od 的前 3 个 ID。
    • @Udi l:这就是分析/排名/加窗函数的PARTITION BY id 部分的作用(在本例中为 ROW_NUMBER)。
    • 你的解决方案完美无缺,这正是我所需要的。 10 倍很多。
    【解决方案2】:

    另一个想法是定义一个 Oracle 临时表

    create global temporary table temp_table_name
    

    Link to more information

    然后在 for 循环中,您可以将行插入到临时表中以获得所有需要的 id。返回的游标将是临时表的内容。当然,这种解决方案只有在无法从单个 sql 查询中获取结果时才有意义

    【讨论】:

    • 我想强调一下,这个查询的性能很关键,应该以最快的方式执行。 10 倍 :)
    • 嗯,完全有可能从单个查询中获取结果,因此全局临时表是不必要的开销。
    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2016-08-27
    • 2015-04-06
    • 2010-10-20
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多