我有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的唯一关联,出于某种未知的原因,它不是。我需要修复它并添加唯一的约束。我只需要在保留一对一的关系,Table1并Table2仅使用留在的ID更新重复的ID Table1。结果,我应该有:
Table1
Table2
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 。
将问题视为保持第 一个 关系。然后,删除并不是那么困难:
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);