Я пытаюсь добиться отображения 1: 1 между двумя таблицами в зависимости от их содержимого. К сожалению, отображение 1: 1 не может быть идеальным, поскольку не обе таблицы содержат одинаковый набор данных. В любом случае, я хочу получить наилучшее возможное совпадение.
Пусть код говорит в примере:
/* (Re-)create first table */
DROP TABLE IF EXISTS Nodes;
CREATE TABLE Nodes (
ID INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL,
Data INTEGER NOT NULL
);
/* Fill some data into the first table */
INSERT INTO Nodes (Data) VALUES (2), (3), (9), (20), (19), (13), (29), (25), (9), (25), (20), (24);
/* (Re-)create second table */
DROP TABLE IF EXISTS Links;
CREATE TABLE Links (
ID INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL,
Data INTEGER NOT NULL,
NodeID INTEGER
);
/* Fill some data into the second table */
INSERT INTO Links (Data) VALUES (9), (9), (13), (19), (20), (20), (21), (24), (25), (25), (29), (30), (32);
/* Now try to macht the two tables */
UPDATE Links
SET NodeID = (
SELECT Nodes.ID
FROM Nodes
WHERE Nodes.Data = Links.Data
/* The following line seems to be executed once per Update, but not for each row of the update, which seems to be my problem */
AND Nodes.ID NOT IN (SELECT NodeID FROM Links WHERE NodeID IS NOT NULL) );
Мой ожидаемый результат будет примерно таким:
Links:
ID | Data | NodeID
----+------+--------
1 | 9 | 3
2 | 9 | 9
...
5 | 20 | 4
6 | 20 | 11
Тем не менее, я получаю:
Links:
ID | Data | NodeID
----+------+--------
1 | 9 | 3
2 | 9 | 3 <- Fail
...
5 | 20 | 4
6 | 20 | 4 <- Fail
Ну, как уже упоминалось в комментарии над последней строкой кода: Моя проблема в том, что обновление игнорирует ранее обновленные строки и, таким образом, вставляет один Nodes.ID многократно. Однако я хочу, чтобы столбец Links.NodeID был уникальным после этого шага. (Не уникально в целом, но для этого шага)
Есть идеи о том, как этого добиться? Я благодарен за любой совет или идею, поскольку я терплю неудачу в этом в течение многих дней.
Большое спасибо, DonLuigi