【问题标题】:Recreating relation between two tables重新创建两个表之间的关系
【发布时间】:2020-02-26 15:07:36
【问题描述】:

我在数据库中不是显式外键的数据之间存在 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 上,但它们创建了笛卡尔积,我最终得到了

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

如何填充fk 字段,以使具有相同value 接收的不同行具有不同的fk

【问题讨论】:

  • 请添加您期望的内容。
  • 它已经在那里了,但我称之为Table 1 final而不是expected。我希望能澄清这个问题。

标签: sql postgresql


【解决方案1】:

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

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

然后你可以UPDATETable1 使用来自Table2 的相应id

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多