Воссоздание отношения между двумя таблицами - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть отношение 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?

1 Ответ

2 голосов
/ 26 февраля 2020

Вам нужно 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

Resultant Table1:

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

Демонстрация по SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...