重新创建两个表之间的关系

时间:2020-02-26 06:42:37

标签: sql postgresql

我在数据库中不是显式外键的数据之间存在1:1关系。例如

表1有一次a,两次b和一次c

id value
1  a
2  b
3  b
4  c

表2还具有一次a,两次b和一次c

id value
5  a
6  b
7  c
8  b

当值相同时,我想从表1到表2创建一个外键:

查询后的预期表1

id value fk
1  a     5
2  b     6
3  b     8
4  c     7

我曾考虑过使用JOIN,但是在t1.value = t2.value上使用了JOIN,但是这些创建了笛卡尔乘积,最后我得到了

id value fk
1  a     5
2  b     6
2  b     8
3  b     6
3  b     8
4  c     7

如何填充fk的不同行具有不同的value来填充fk字段?

1 个答案:

答案 0 :(得分:2)

您需要根据每个表中每个JOIN的行号来value个表;那么您可以从id中选择Table2值来设置fk中的Table1列。首先,添加新列:

ALTER TABLE Table1 ADD COLUMN fk INT REFERENCES Table2(id)

然后,您可以使用UPDATE中的相应Table1 id Table2

WITH CTE1 AS (
  SELECT id, value,
         ROW_NUMBER() OVER (PARTITION BY value) AS rn
  FROM Table1
),
CTE2 AS (
  SELECT id, value,
         ROW_NUMBER() OVER (PARTITION BY value) AS rn
  FROM Table2
)
UPDATE Table1
SET fk = CTE2.id
FROM CTE1
JOIN CTE2 ON CTE2.value = CTE1.value AND CTE2.rn = CTE1.rn
WHERE CTE1.id = Table1.id

结果Table1

id  value   fk
1   a       5
2   b       6
3   b       8
4   c       7

Demo on SQLFiddle