0

我遇到了 oracle 的问题,只需创建带限制的简单选择,但 oracle 没有这个功能,所以我写了类似的东西

     select b.strdir,b.num, b.value, b.time  

          from mytable b
         where b.dev_id = 223
           and b.cur_id = 23
           and b.time=(
                select xx.time from mytable xx
                where xx.dev_id = b.dev_id and xx.cur_id = b.cur_id and xx.nom = b.nom
                and rownum=1
                order by xx.time DESC
               )

         order by b.strdir nulls first;

但它不起作用请帮助:/

4

4 回答 4

4

这种类型的查询最好使用第一个/最后一个聚合函数(也称为“保持子句”)来处理,尽管我没有测试过这个查询。

select max(b.strdir) keep (dense_rank last order by b.time) strdir
     , max(b.num) keep (dense_rank last order by b.time) num
     , max(b.value) keep (dense_rank last order by b.time) value
     , max(b.time) time  
  from mytable b
 where b.dev_id = 223
   and b.cur_id = 23
 group by b.nom
 order by strdir nulls first

http://rwijk.blogspot.com/2012/09/keep-clause.html

问候,
罗布。

于 2012-10-03T07:28:39.520 回答
1

要获取最近使用的 dev_id、row_id 对:

 select b.strdir,b.num, b.value, b.time  
      from mytable b
     where b.dev_id = 223
       and b.cur_id = 23
       and b.time =(
            select max(xx.time) from mytable xx
            where xx.dev_id = b.dev_id and xx.cur_id = b.cur_id 
              and xx.nom = b.nom --> not sure this line is necessary
           )
     order by b.strdir nulls first;

请注意,在ROWNUM = 1应用时,该SORT BY子句被忽略,因为SORT BY在. 解决方案是使用一个子查询来查找最新时间。WHEREMAX(time)

还要注意返回重复行的风险,以防可能存在具有相同time值的行。一种可能的解决方案是SELECT DISTINCT在外部 SQL 中使用 a 。

于 2012-10-03T08:05:34.343 回答
1

Oracle 在一行通过谓词之后分配 rownum,因此您的 where 子句永远不会让任何东西通过。在 oracle 中选择 TOP n 的规范方法是:

select * from ( <your statement> ) where rownum <= N
于 2012-10-03T06:49:32.237 回答
0
    select b.strdir,b.num, b.value, b.time  

      from mytable b
     where b.dev_id = 223
       and b.cur_id = 23
       and b.time=(
            select max(xx.time) from mytable xx
            where xx.dev_id = b.dev_id and xx.cur_id = b.cur_id and xx.nom = b.nom

           )

     order by b.strdir nulls first;

这是好版本吗?最大(xx.time)

于 2012-10-03T07:37:53.137 回答