【问题标题】:PL/SQL perform multiple selects looping over array of values, aggregating resultPL/SQL 在值数组上执行多个选择循环,聚合结果
【发布时间】:2017-04-08 02:22:21
【问题描述】:

我需要生成一组行,其中每一行都是复杂选择的结果,并且每个选择都基于另一个列表中的值。

换句话说,我需要执行如下任务:

select * from ( 
    select col1, col2, col3 from data_table where guid=my_guid 
    order by col1)
    where rownum<=1

除了我需要对取自另一个表的my_guid 值序列执行此操作,并获得适合从中选择的结果的联合。

简单地说where guid in (select * from guid_list) 将只产生一个结果,因为rownum,但我想要与每个guid 关联的排名靠前的行。

我在弄清楚正确的方法是什么时遇到了一些麻烦。

在带有返回第一个结果的聚合器的 SQL 变体中,我可以这样做:

select col1, first(col2), first(col3) from data_table
    order by col1 group by guid

在调试时,我没有对数据库的写入权限,所以我想避免涉及创建临时表、过程或函数的解决方案。

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

    您可以将表连接在一起(而不是使用第二个子查询,尽管这也可以),并使用分析函数根据每个 guid 为结果分配排名。比如:

    select col1, col2, col3 from ( 
      select dt.col1, dt.col2, dt.col3,
        row_number() over (partition by dt.guid order by col1) as rn
      from guid_list gl
      join data_table dt on dt.guid=gl.guid 
    )
    where rn = 1;
    

    如果结果集中需要,您可以在子查询中包含 guid 本身。

    如果您只想使用聚合函数而不使用子查询,您还可以执行以下操作:

    select min(dt.col1) as col1,
      min(col2) keep (dense_rank first order by dt.col1) as col2,
      min(col3) keep (dense_rank first order by dt.col1) as col3
    from guid_list gl
    join data_table dt on dt.guid=gl.guid 
    group by dt.guid;
    

    Read more about keep dense_rank first..

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2014-08-05
      • 2019-04-06
      • 2012-02-26
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多