【问题标题】:Update table with different values from a different table which is grouped使用分组的不同表中的不同值更新表
【发布时间】:2021-04-30 12:28:21
【问题描述】:

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

如何更改所有 table1.table2_id 字段,以免重复名称?

目前: 表 1:

id blabla table2_id
1 row 1001
2 row 1002
3 row 1003
4 row 1004
5 row 1004
6 row 1005

表2:

id name
1001 Bob
1002 Bob
1003 Bob
1004 Jack
1005 Jack

期望的结果: 表 1:

id blabla table2_id
1 row 1001
2 row 1001
3 row 1001
4 row 1004
5 row 1004
6 row 1004

表2:

id name
1001 Bob
1004 Jack

所以,我需要:

  1. 将所有 table1.table2_id 更新为按名称分组的前 1 个 table2.id
  2. 从 table2 中删除重复行

由于 table2 中有数千个重复字段,因此我无法使用这种情况..

我尝试的解决方案为每个名称返回 1 个 id,但我在可以更新表的部分失败。

update table1 d
set d.table2_id  = 
(select
b.id
from table2 b
where b.name in (select min(id) keep(dense_rank first order by id) id
     , name
  from table2
 group by name)
order by b.id ASC
)
where d.table2_id in ( SELECT b.id FROM table2 b WHERE b.name in (select min(id) keep(dense_rank first order by id) id
     , name
  from table2
 group by name));

请帮忙:)

【问题讨论】:

  • 您实际使用的是哪些 dbms?
  • 从keep(...)结构来看,你使用的是Oracle。如果是这样,请仅使用 Oracle 标记您的问题,而不是使用几个随机数据库产品!

标签: sql oracle


【解决方案1】:

这里是语法正确的 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
);
delete from table2
where id not in (
  select min(id) from table2 group by name
);

这里使用了analytic functionmin(id) over (partition by name),这样您就可以拥有所有原始ID及其新ID(name相同的集合中的最小ID)。

【讨论】:

    【解决方案2】:

    这是一种方法:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多