有这么一个表
id no time name
1 1 2012-01-01 a
1 2 2012-01-01 b
2 1 2013-12-12 a
3 1 2013-02-04 c
...
现在想做一个视图,如果有两行数据,其中ID,TIME两列值相同(类似于前两行),则只显示no比较小的那条,如果没有相同的,则正常显示
结果类似
id no time name
1 1 2012-01-01 a //过滤掉了第二行
2 1 2013-12-12 a
3 1 2013-02-04 c
...

解决方案 »

  1.   

    select a.* from a where a.no = (
    select min(no) from b where b.id = a.id and b.time= a.time);可以结贴了。
      

  2.   

    楼上的会不会有问题,当no不是唯一码的时候会取多的,如果要这样用的话请用rowid。
    或者partition by,例如:
    select * from (
    select id,no,time ,name ,row_number() over(partition by time,id order
    by no asc) rowno from 
    (select 1 id,1 no,'2012-01-01' time,'a' name from dual
    union select 1 id,2 no,'2012-01-01' time,'a' name from dual
    union select 2 id,1 no,'2013-12-12' time,'a' name from dual
    union select 3 id,1 no,'2013-02-04' time,'a' name from dual
    )t
    )
    where rowno=1
      

  3.   


    简单的问题不要用复杂的方法。目前这个用不着用分区,刀要用在刃上。
    是的,你那个方法也是没有问题的。我理解错了,我之前遇到过类似的问题,跟这个情况还是不太一样。不过貌似效率上的话,是不是用一个表还高点?正常是一个表是快。但也要看看表结构是什么,索引等等。否则一个表也不见得会快。
    索引什么的不说了,不在这块讨论范畴。另外想问下,你这种写法oralce的解析顺序是怎样的,我感觉好多时候这样写不便于理解,好多时候容易出问题,尤其是当查询比较复杂的时候,没办法分步测试。
      

  4.   


    简单的问题不要用复杂的方法。目前这个用不着用分区,刀要用在刃上。
    是的,你那个方法也是没有问题的。我理解错了,我之前遇到过类似的问题,跟这个情况还是不太一样。不过貌似效率上的话,是不是用一个表还高点?正常是一个表是快。但也要看看表结构是什么,索引等等。否则一个表也不见得会快。
    索引什么的不说了,不在这块讨论范畴。另外想问下,你这种写法oralce的解析顺序是怎样的,我感觉好多时候这样写不便于理解,好多时候容易出问题,尤其是当查询比较复杂的时候,没办法分步测试。查询复杂就不会用这种方法的了。
    就上面的例子而言,其实就类似于select distinct(id), min(no) from a group by id,上面不过是同一个表分开两个,用hash join方法用b作为驱动,从b中找no最少值,之后在hash表找在a中其对应的id,但是distinct执行效率低,不用distinct那种而已。你可以试试用explain看看。这是我个人理解。