admin

SQL:如何在单独的表中更新重复项?

sql

我有2张表:

Table1:    
id1 | id2
1   | a
2   | a
3   | a
4   | b
5   | b

Table2:    
data | id1
...  | 1
...  | 2
...  | 2
...  | 3
...  | 4
...  | 5

Table1我应该具有id1->
id2的唯一关联,出于某种未知的原因,它不是。我需要修复它并添加唯一的约束。我只需要在保留一对一的关系,Table1Table2仅使用留在的ID更新重复的ID
Table1。结果,我应该有:

Table1:    
id1 | id2
1   | a
4   | b

Table2:    
data | id1
...  | 1
...  | 1
...  | 1
...  | 1
...  | 4
...  | 4

我知道如何查找重复的ID:

SELECT id1 FROM Table1 GROUP BY id2 HAVING COUNT(id2) > 1;

但是我对下一步的更新和删除有些迷惑。

id1和id2的数据类型为 UUID


阅读 140

收藏
2021-06-07

共1个答案

admin

将问题视为保持第 一个 关系。然后,删除并不是那么困难:

delete from table1
     where table1.id1 > (select min(tt1.id1) from table1 tt1 where tt1.id2 = table1.id2);

现在,要修复table2,我们需要一个更复杂的查询,该查询可保存由此产生的结果。幸运的是,Postgres允许CTE包含数据修改步骤:

with todelete as (
      select t1.*, min(t1.id1) over (partition by id2) as keepid
      from table1
     ),
     d as (
      delete from table1   
      where table1.id > (select min(tt1.id) from table1 tt1 where tt1.id2 = table1.id2)
    )
update table2
    set id1 = (select keepid from todelete where todelete.id1 = table2.id2);
2021-06-07