我在数据库中不是显式外键的数据之间存在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
字段?
答案 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