Sql 使用分组的不同表中的不同值更新表

Sql 使用分组的不同表中的不同值更新表,sql,oracle,Sql,Oracle,我有一个名为table1的oracle表,它有一个来自table2的外键。 表2有两列:id、name table2.name有很多重复项需要整理,所以我按名称对table2进行分组,每个名称只保留一个id。 然而,table1.table2_id使用了大量重复的字段 如何更改所有table1.table2_id字段,以便不存在重复的名称 目前: 表1: 身份证件 布拉布拉 表2 1. 一行 1001 2. 一行 1002 3. 一行 1003 4. 一行 1004 5. 一行 1004 6.

我有一个名为table1的oracle表,它有一个来自table2的外键。 表2有两列:id、name table2.name有很多重复项需要整理,所以我按名称对table2进行分组,每个名称只保留一个id。 然而,table1.table2_id使用了大量重复的字段

如何更改所有table1.table2_id字段,以便不存在重复的名称

目前: 表1:

身份证件 布拉布拉 表2 1. 一行 1001 2. 一行 1002 3. 一行 1003 4. 一行 1004 5. 一行 1004 6. 一行 1005 这里有一个方法:

update table1 d
set d.table2_id = x.id_tokeep
from 
(
select name , id , min(id) over (partition by name ) as id_tokeep
from table2
) x
 where x.id = d.table2_id

delete from table2
where id not in ( select min(id) from table2 group by name)

以下是语法正确的Oracle语句

update table1 t1
set t1.table2_id = (
  select new_id
  from (
    select id, min(id) over (partition by name) new_id
    from table2
  ) d
  where d.id = t1.table2_id
);

这里使用了
min(id)over(按名称划分)
,这样您就可以拥有所有原始id及其新id(名称相同的集合中的min id)。

您实际使用的是哪种dbms?从keep(…)结构判断,您使用的是Oracle。如果是这样的话,请只使用Oracle标记您的问题,而不要使用几个随机数据库产品!非常感谢。这起作用了:)
delete from table2
where id not in (
  select min(id) from table2 group by name
);