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

通过消除重复来返回行的oracle sql查询,sql,oracle11g,duplicates,Sql,Oracle11g,Duplicates,我对下面的情景感到震惊。需要您的帮助,根据以下示例数据修改我的查询。我的目标是使用TEM GT和TXN表中的可用数据创建事件和事件 temu GT(全局临时表) est_id primary key, trans_id, trp_id, amount 1 111 2221 1.5 2 111 3332 2.0 3 112

我对下面的情景感到震惊。需要您的帮助,根据以下示例数据修改我的查询。我的目标是使用TEM GT和TXN表中的可用数据创建事件和事件

temu 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  
事件低表(最终表)


基于TEM_GT和TXN GT,将数据填充到事件表中。现在,当我尝试填充EVENT_LOW表中的数据时,上面的查询返回5行而不是3行。这是由于TEM GT表中的trp_id造成的。我不想在事件表中添加trp_id,而是想在上面的select查询中处理重复消除

我正在使用Oracle11g。请帮我做这个

我只是构建下面的sql。这几乎解决了我的问题。但有时它会为amount列返回不同的值。我希望est id1的事件低结果如下所示

 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    



任何帮助都可以进一步调整它以获得准确的结果。提前感谢

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

但是,您的问题的答案可能是使用
选择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'

您在插入时的语法不正确,这表明您编辑了查询,删除了有问题的部分。

我的第一反应是使用
DISTINCT
。然后我注意到复制品有不同的
数量
。 您需要决定使用哪个
金额
,然后应用相应的组功能

示例(如果愿意,请替换
MAX
SUM
):


请编辑您的帖子并格式化表设计和sql示例代码。问题中的信息与您描述的行为不匹配。数据库中与SQL匹配的行比上面显示的多!您应该全面检查您的问题,因为它有几个错误:TEM_GT:est_id=2,但在EVENT_LOW中对应行的值为1。insert的语法错误,缺少表名。得到5行的原因可能是在trans_is=111.Hi Klas的事件中有2行。对你是对的。因为事件表有两行用于trans_is=111,TEM_GT表也有两行用于trans_is=111。我需要EVENT_LOW表应该有两行用于trans_is=111。就是这样。因此,在select语句的4行中,我只需要2行。insert语句无法工作。缺少一个表名。您好@Gordon linoff,我已尝试了您的查询。仍然为事件\u id 1000获取4行。但只需要两行。对我已经编辑了我的查询。您好,Gordon,您的查询出现错误
ORA-02287:此处不允许序列号
。您好,Klas,实际上,我需要处理所有金额(在本例中,对于trans_id 111,需要同时处理1.5和2.0)。上述连接不起作用。我仍然得到了事件id-1000的4行。啊,
est\u id
也不同。我已经编辑了我的答案,也许这更符合你的要求?嗨,克拉斯,我需要分别处理每个est_id。因此,我的event_low表应该有两行用于
est_id
1,并且金额不应该求和。应该分开处理<代码>事件低id主键、事件id、est id、金额。9991 1000 1 1.5 9992 1000 1 2.0 9993 1001 2 3.0在这种情况下,您应该检查Gordon Linoff的答案。这似乎是正确的。如果获得的行太多,那是因为数据库中与SQL匹配的行比问题中显示的多。
 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
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'
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