现在有个要求:
有2个表A和B
A             B
1  key        1  key
2  key        2  key
3  key        3  key
              4  
              5
              6 (日期)
              7
              8
              9 
              10 要求A.1 = B.1 ,A.2 = B.4 ,A.3 = B.5 左连如果A表对B表有多条数据的时候 取B.6中数据最大那条的纪录
现在有种情况就是B表的6(日期)字段中如果有相同的纪录的时候
要先按7,8,9,10的顺序降序排列 再取第一行而且在SELECT的时候要取B表中的 7,8,9,10在线急等,请各位高手解答,谢谢!!!

解决方案 »

  1.   

    以下建视图
    select a.1,a.2,a.3,a.4,a.5,a.6,a.7,a.8 from a,b,c wher a.1=b.1(+) and b.1=c.1(+)
    order by   a.1,a.2,a.3,b.6 desc ,a.6 desc,a.7 desc,a.8 desc然后
      select *  from 视图名 where rowid in (select rid from (select rowid rid,row_number() over(partition by a.1,a.2,a.3 order by rowid) rn 
                     from 视图名 ) where rn <> 1 );
      

  2.   

    写错了.
    以下建视图 
    select a.1,a.2,a.3,a.4,a.5,a.6,a.7,a.8 from a,b,c wher a.1=b.1(+) and b.1=c.1(+) 
    order by  a.1,a.2,a.3,b.6 desc ,a.6 desc,a.7 desc,a.8 desc 然后 
      select *  from 视图名 where rowid in (select rid from (select rowid rid,row_number() over(partition by a.1,a.2,a.3 order by rowid) rn 
                    from 视图名 ) where rn =1 ); 
      

  3.   

    首先谢谢楼上的回答
    第一能不能不用视图实现 
    第二就有2个表 A表也没有那么多的字段 A             B 
    1  key        1  key 
    2  key        2  key 
    3  key        3  key 
                  4  
                  5 
                  6 (日期) 
                    7 
                  8 
                  9 
                  10 
      

  4.   

    A             B 
    1  key        1  key 
    2  key        2  key 
    3  key        3  key 
                     4  
                     5 
                     6 (日期) 
                       7 
                     8 
                     9 
                     10 
      

  5.   

    A  表
    1  key
    2  key 
    3  key
    B  表
    1  key 
    2  key 
    3  key 
    4  

    6 (日期) 



    10 
    以上是表的结构  上面的可能排版有问题
      

  6.   

    select * 
    from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC,B.C10 DESC) rn
    from b) c
    where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1
      

  7.   

    按6,7,8,9的顺序降序排列 再取第一行 问题谢的有问题  不好意思如果这样 yuyu1980 程序是不是这样select * 
    from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn 
    from b) c 
    where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1
    就不用C10 DESC排序了?还有c.rn=1 这样不就是只能出子表C中的第一条了吗?第一次用oracle 有很多不明白的地方望指导谢谢
      

  8.   

    我刚才上网查了下
    是不是
      表a,内容如下:   
      B C D   
      02 02 1   
      02 03 2   
      02 04 3   
      02 05 4   
      02 01 5   
      02 06 6   
      02 07 7   
      02 03 5   
      02 02 12   
      02 01 2   
      02 01 23      SELECT   b,   c,   OVER(PARTITION   BY   b,c   ORDER   BY   d)   e  FROM   a   
      B C E  
      02 01 2                          
      02 01 5                         
      02 01 23                     
      02 02 1                        
      02 02 12     
      02 03 2    
      02 03 5     
      02 04 3     
      02 05 4     
      02 06 6     
      02 07 7  
    如果是这样 下面的假如是你写的子查询
    SELECT   b,   c,   row_number() OVER(PARTITION   BY   b,c   ORDER   BY   d)   e  FROM   a 然后外面在做 外面在做rn=1
    结果:  B C E  
      02 01 2                          
                          
      02 02 1                        
        
      02 03 2    
         
      02 04 3     
      02 05 4     
      02 06 6     
      02 07 7 也就是说row_number() 是去掉PARTITION   BY 后面相同的字段 b,c 有相同的 就去掉?然后你在rn=1 就是取每个组中的第一条记录不知道我的理解股对不对?
      

  9.   

    我明天还要加班 就先下了 谢谢yuyu1980 的帮助 明天一早我会还会上来看的问题很紧急我都晕了!
      

  10.   

    select * 
    from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn 
    from b) c 
    where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1 --将b表以b.c1,b.c4,b.c5 分组排序,即只要b.c1,b.c4,b.c5 相同 那么rn就会是 1 2 3 ...
    select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC--c.rn=1 就是只取第一条,不知道你想要的是不是这个结果
    select * 
    from a,(select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn 
    from b) c 
    where A.C1=c.C1 AND A.C2=c.C4 AND A.C3=c.C5(+) and c.rn=1 
      

  11.   

    yuyu1980  我刚才试了 你的方法好用现在有2个问
    1,select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn 
    from b  这样就是对所有的B表进行分组排序了。我是不是可以在此加where和A表先连下
    select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn 
    from b  where A.1 = B.1 ,A.2 = B.4 ,A.3 = B.5 
    这样是不是会快点2,要先按6,7,8,9的顺序降序排列 再取第一行  现在是如果 [B.7] 空或者NULL的时候就给这条记录放到最后一行我是这么想的:
    如果分组排序的时候[B.7]在此分组都为空或者NULL那么这个字段就应该在排序的时候不起作用了如果分组排序的时候[B.7]在此分组的时候就有一条记录有值那么这条记录一定是排在最前面了如果分组排序的时候[B.7]在此分组的时候有多条记录忧值那么 就应该B.C6 DESC,B.C8 DESC,B.C9 DESC排序请问这样的话如何改这个SQL?
      

  12.   

    我现在想到的是能不用 decode函数做个判断 但是怎么加呢?
    加的时候应该要影响到rn 的顺序 那就要加到 row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) 这里面吧
      

  13.   

    可以先关联
    select * 
    from {select b.*,row_number() over(PARTITION by b.c1,b.c4,b.c5 order by B.C6 DESC,B.C7 DESC,B.C8 DESC,B.C9 DESC) rn 
    from b,a
    where A.C1=b.C1 AND A.C2=b.C4 AND A.C3=b.C5(+))
    wehre rn=1