oracle sql查询通过消除重复来返回行

时间:2013-04-08 06:54:10

标签: sql oracle11g duplicates

我对以下情况感到震惊。需要您的帮助,根据以下示例数据修改我的查询。我的目标是使用TEM_GT和TXN表中的数据创建EVENT AND EVENT_LOW。

TEM_GT(全球临时表)

est_id primary key, trans_id, trp_id, amount  
  1                   111      2221      1.5   
  2                   111      3332      2.0  
  3                   112      4443      3.0 

TXN表

trans_id, trans_type
111          type1  
112          type1 

活动表

event_id primary key, trans_id,  trans_type, flag.  
   1000                 111         type1      N  
   1001                 112         type1      N  

EVENT_LOW表(决赛桌)

 event_low_id primary key, event_id, est_id, amount.  
    9991                      1000     1       1.5  
    9992                      1000     2       2.0  
    9993                      1001     3       3.0  

insert into(event_low_id, event_id, est_id, amount) 
 (
    select event_low_id_s.nextval e.event_id, tg.est_id, tg.amount from
    from   TEM_GT tg, EVENT ee
    WHERE
          tg.trans_id    = e.trans_id   
    AND e.flag           = 'N'
 );

基于TEM_GT和TXN gt,将数据填充到EVENT表中。现在,当我尝试在EVENT_LOW表中填充数据时,上面的查询返回5行而不是3行。这是由于TEM_GT表中的trp_id。我不想在EVENT表中添加trp_id,并希望在上面的选择查询中处理重复消除。

我正在使用Oracle 11g。请帮帮我。

我只是构建下面的sql。它几乎解决了我的问题。但有时它会为金额列返回不同的值。我希望我的event_low结果如下所示为est_id 1

 event_low_id primary key, event_id, est_id, amount.    
    9991                      1000     1       1.5    
    9992                      1000     2       2.0      

但有时会返回

 event_low_id primary key, event_id, est_id, amount.    
    9991                      1000     1       1.5    
    9992                      1000     2       1.5    

 event_low_id primary key, event_id, est_id, amount.    
    9991                      1000     1       2.0    
    9992                      1000     2       2.0  

select *  
      from (select x.*,  
                    row_number() over (partition by event_id order by event_id) rn  
              from (seelct e.event_id, tg.est_id, tg.amount  
                           from   TEM_GT tg, EVENT e  
         WHERE  
               tg.trans_id    = e.trans_id     
               AND e.flag           = 'N'  
                    ) x  
            )  
      where rn = 1

任何帮助进一步调整它以获得确切的结果。提前致谢

2 个答案:

答案 0 :(得分:0)

据我所知,您的示例查询应根据条件返回3行。

但是,您的问题的答案可能是使用select distinct。我还建议使用标准join语法:

select distinct event_low_id_s.nextval, e.event_id, tg.est_id, tg.amount
from TEM_GT tg join
     EVENT ee
     on tg.trans_id = e.trans_id   
where e.flag = 'N'

insert上的语法不正确,这表示您编辑了查询,删除了有问题的部分。

答案 1 :(得分:0)

我的第一直觉是使用DISTINCT。然后我注意到重复项有不同的amount。 您需要决定使用哪个amount,然后应用适当的组功能。

示例(如果您愿意,请替换MAXSUM):

select event_low_id_s.nextval e.event_id, MAX(tg.est_id), SUM(tg.amount)
from TEM_GT tg join
     EVENT ee
     on tg.trans_id = e.trans_id   
where e.flag = 'N'
group by e.event_id