最近有一个项目在做迁移,是从sqlserver到oracle。如下语句遇到麻烦了。不知道该怎么写了select             
               (select top(1) c.skss_swjg_dm
                        from  c
                       where c.nsrsbh = b.nsrsbh
                       order by c.swdjblx_dm)
          from a, b
         where a.nsrdzdah = b.nsrdzdah
         group by b.nsrsbh
这个子查询
 (select top(1) c.skss_swjg_dm
                        from  c
                       where c.nsrsbh = b.nsrsbh
                       order by c.swdjblx_dm)执行顺序是
先c表关联b表,然后按swdjblx_dm排序,处理好的结果再取第一行。
1.首先oracle里面select后面的子查询不能order by操作
 order by c.swdjblx_dm会报错2.ORACLE里面没有TOP的概念,只有rownum,TOP和ROWNUM不同,TOP是查询出来结果后再判断,ROWNUM要想达到和TOP一样的效果只能在外面套一层,这样会有一个问题就是套一层以后 where c.nsrsbh = b.nsrsbh这里的B表识别不了了。
 select k. skss_swjg_dm from 
               (select c.skss_swjg_dm
                        from  c
                       where c.nsrsbh = b.nsrsbh
                       order by c.swdjblx_dm) k
  where rownum = 1

解决方案 »

  1.   

    题目相当容易,但是要查询的结果字段,一个都没有说,这个本身就是最大的问题。
    我这里只用"相关字段"代替,你需要哪个字段就填写哪个字段。select a表相关字段字段,b表相关字段字段
      from a,
           (select c表相关字段,b表相关字段
          from(select c.skss_swjg_dm,row_number()over(order by c.swdjblx_dm) rn
             from c, b
            where c.nsrsbh = b.nsrsbh
          )
            where rn = 1
    )b
     where a.nsrdzdah = b.nsrdzdah  
      

  2.   

    子查询中如果只是取某个字段最小值,那么可以使用oracle的一个聚合函数min(字段名)