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

Sql 如何通过查找重复行记录更新表的列,sql,oracle,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@

我有一个包含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

如前所述,在任何一种情况下,我的预期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 

我希望。。我的要求现在很清楚了

您的问题是,第二列在连接回第一列时不是唯一的。因此,您需要使其唯一,例如,使用解析函数


这是一种存储和表示数据的稍微奇怪的方式。有一个单独的电子邮件栏可能更有意义,您可以将所有电子邮件插入其中。然后,您可以选择所有内容。

我发现了一些符合预期方向但不完全符合您的输出的内容:
选择不同的Id,第一个值(email1忽略空值)覆盖(按Id顺序划分,按email1清空当前行和无界行之间的第一行)作为mail1,第一个值(email2忽略空值)覆盖(按ID排序按email2将当前行和无界行之间的第一行设为空)作为表1中的mail2按1排序
谢谢!老兄。我的问题得到了一个接近、完整的解决方案。实际上,在我声明的问题中,一个ID最多可以容纳2个电子邮件ID。因此,对于ID-1(rownum 1,2),电子邮件ID如预期的那样出现(01 abc@x.com cdf@y.com)但是ID-1(rownum3的)也将作为(01)出现pwe@y.com cdf@y.com)1.我不想cdf@y.com很抱歉,您的更改一点也不清楚。为什么
hji
附加到
gty
而不是
fgt
?谢谢您的回答。但我的问题是在重复ID时更新其中一个电子邮件列。任何ID在电子邮件中最多可以有2个值(email1和email2),如果下一行重复相同的ID,我不需要在我的行中进行更新。我希望你明白我想说的。我正在更新我的代码以满足明确的要求。
Id    email1      email2
01    hji@r.com   fgt@r.com 
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