如何通过查找重复行记录来更新表的列

时间:2013-11-30 11:07:33

标签: sql oracle

我有一个包含3列的表。

Id    email1    email2
01   abc@x.com   
01                cdf@y.com
01   pwe@y.com
02   ert@x.com
03                ghu@x.com
03   cdf@y.com
04   oiu@x.com    ghy@y.com

我想将具有预期输出/结果的同一个表更新为

Id    email1       email2
01    abc@x.com    cdf@y.com
01    pwe@y.com
02    ert@x.com
03    cdf@y.com    ghu@x.com
04    oiu@x.com

有没有办法创建一个可以选择数据并显示预期输出/结果的视图?

示例:

Id    email1       email2
01    abc@x.com    
01                 cdf@y.com
01    pqr@v.com
01                 scf@y.com
01    dfg@r.com
01    fgt@r.com
01                  hji@r.com
01    gty@t.com

我的输出应该是

Id     email1     email2
01     abc@x.com  cdf@y.com
01     pqr@v.com  scf@scf.com
01     dfg@r.com
01     fgt@r.com 
01     gty@t.com  hji@r.com 

基本上我的要求是:ID和其中一个eamil得到更新,或者我想把它呈现在存在的条件下:

案例1

Id   enmail     email2
01   abc@x.com  
01              scf@fg.com

或 案例2

Id    email1    email2
01              fgt@r.com
01    hji@r.com

as,我预期的o / p应该在下面的任何一个案例中给出

案例1 o / p

Id   email1     email2
01   abc@x.com  scf@fg.com

案例2 o / p

Id    email1      email2
01    hji@r.com   fgt@r.com 

我希望......现在我的要求很明确。

1 个答案:

答案 0 :(得分:1)

您的问题是第二列在连接回第一列时是非唯一的。因此,您需要通过使用分析函数ROW_NUMBER()

使其独一无二
select a.id, a.email1, b.email2
  from ( select id, email1
              , row_number() over (partition by id order by 1) as r
           from table1
          where email1 is not null
                ) a
  left outer join 
       ( select id, email2
              , row_number() over (partition by id order by 1) as r
           from table1
          where email2 is not null
                ) b
   on a.id = b.id
  and a.r = b.r
order by a.id, a.email1, b.email2

SQL Fiddle

这是一种存储和表示数据的略微好奇的方法。拥有一个电子邮件列可能更有意义,您可以插入所有电子邮件。然后您可以选择所有内容。