Sql 如何使用update from select语句设置唯一列值
我试图根据两个表的内容在它们之间实现1:1的映射。不幸的是,1:1映射并不完美,因为并非两个表都包含完全相同的数据集。不管怎样,我想要最好的一对 让代码在一个示例中讨论:Sql 如何使用update from select语句设置唯一列值,sql,sqlite,join,sql-update,Sql,Sqlite,Join,Sql Update,我试图根据两个表的内容在它们之间实现1:1的映射。不幸的是,1:1映射并不完美,因为并非两个表都包含完全相同的数据集。不管怎样,我想要最好的一对 让代码在一个示例中讨论: /* (Re-)create first table */ DROP TABLE IF EXISTS Nodes; CREATE TABLE Nodes ( ID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE N
/* (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
链接:
ID |数据|节点ID
----+------+--------
1 | 9 | 3
2 | 9 | 3在每个表中使用窗口功能,以便正确链接要更新的行:
UPDATE Links
SET NodeID = (
SELECT n.ID
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Data ORDER BY ID) rn
FROM Nodes
) n INNER JOIN (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Data ORDER BY ID) rn
FROM Links
) l ON l.Data = n.Data AND l.rn = n.rn
WHERE n.Data = Links.Data AND l.ID = Links.ID
);
请参阅。
或带有:
请参阅。
结果:
百万次:谢谢!这是惊人的,我设法让它在我真正的数据库工作!令人惊叹的。我需要说的是,我遇到了一些麻烦:对于开发,我使用SQLiteStudio,它目前不支持ROW_NUMBER()函数。但是,最新的sqlite3 python模块确实如此。最后,我终于取得了我的成绩,真是太棒了!非常感谢。最好的,唐路易吉
WITH cte AS (
SELECT n.ID nID, n.Data nData, l.ID lID, l.Data lData, l.NodeID lNodeID
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Data ORDER BY ID) rn
FROM Nodes
) n INNER JOIN (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Data ORDER BY ID) rn
FROM Links
) l ON l.Data = n.Data AND l.rn = n.rn
)
UPDATE Links
SET NodeID = (
SELECT nID FROM cte
WHERE nData = Links.Data AND lID = Links.ID
);
| ID | Data | NodeID |
| --- | ---- | ------ |
| 1 | 9 | 3 |
| 2 | 9 | 9 |
| 3 | 13 | 6 |
| 4 | 19 | 5 |
| 5 | 20 | 4 |
| 6 | 20 | 11 |
| 7 | 21 | |
| 8 | 24 | 12 |
| 9 | 25 | 8 |
| 10 | 25 | 10 |
| 11 | 29 | 7 |
| 12 | 30 | |
| 13 | 32 | |