Sql 如何通过查找重复行记录更新表的列
我有一个包含3列的表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@
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