select tsk,act,flt,arn,username from
(
select tsk, act, flt, arn, username 
from epare_crewtask where  tsk='200905241653PEK000'
union
select tsk,act, flt, arn, username 
from epare_crewtask_bak  where  tsk='200905241653PEK000'
)产生了2条重复记录,在google上查了,说是用rowid可以解决这个问题,但是,我按照网上的办法运行后,报错,说是不能在动态产生的表上这么用,请高人们帮帮忙,使用SQL有没有办法去除重复的记录?

解决方案 »

  1.   

    正常情况下,union本身会过滤重复记录。如果你查询出来还是有重复的,可以查看下这两条记录查询出来的字段。可能里面含有空格等特殊字符
      

  2.   

    select distinct tsk,act,flt,arn,username from
    (
    select tsk, act, flt, arn, username
    from epare_crewtask where  tsk='200905241653PEK000'
    union
    select tsk,act, flt, arn, username
    from epare_crewtask_bak  where  tsk='200905241653PEK000'
    )
      

  3.   


    正解,用distinct来解决重复问题,不过效率不是很高啊!
      

  4.   

    这样产生的记录,
    对完全一样的记录,union会自动去重复,
    如果只是id相同,就不能去除掉了可以用分析函数row_number去重复,查一查,相关的帖子很多
      

  5.   

    select *
    from(
    select nvl(a.tsk,b.tsk) tsk, ...
    from epare_crewtask a
     full outer join epare_crewtask_bak  b
     on (a.tsk='200905241653PEK000' and a.tsk = b.tsk)
          )
    group by tsk...
      

  6.   

    谢谢大家,我做了测试,确实是发现有个字段的值里含有空格,就是username,我做了如下修改
    select tsk,act,flt,arn,airline airlinechn,std,username from(
    select tsk, act, flt, arn, airlinechn airline,dep3, std, trim(getCaptainByTsk(tsk)||' '||getCaptainByTsk2(tsk)) username 
    from epare_crewtask where (std between to_date('2009-5-24','yyyy-MM-dd') and to_date('2009-5-24','yyyy-MM-dd')+1)
    and tsk='200905241653PEK000'
    union
    select tsk,act, flt, arn, airlinechn airline,dep3, std, getCaptainByTskbak(tsk) username 
    from epare_crewtask_bak  where (std between to_date('2009-5-24','yyyy-MM-dd') and to_date('2009-5-24','yyyy-MM-dd')+1)
    and tsk='200905241653PEK000')