【发布时间】: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 |
所以,我需要:
- 将所有 table1.table2_id 更新为按名称分组的前 1 个 table2.id
- 从 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 标记您的问题,而不是使用几个随机数据库产品!