我假设你有一个这样的表结构:
CREATE TABLE Table1 (
Col1 INT NOT NULL,
Col2 INT NOT NULL,
Col3 INT NOT NULL,
Col4 INT NOT NULL,
Col5 INT NOT NULL,
Col6 INT NOT NULL,
PRIMARY KEY (Col1, Col2, Col3, Col4)
);
CREATE TABLE Table2 (
Col1 INT NOT NULL,
Col2 INT NOT NULL,
Col3 INT NOT NULL,
Col4 INT NOT NULL,
Col5 INT NOT NULL,
Col6 INT NOT NULL,
PRIMARY KEY (Col1, Col2, Col3, Col4)
);
你有这样的样本数据:
INSERT INTO Table1 (
Col1, Col2, Col3, Col4, Col5, Col6
)
VALUES
(1, 1, 1, 1, 25, 7),
(2, 2, 2, 2, 8, 9),
(3, 3, 3, 3, 25, 12);
INSERT INTO Table2 (
Col1, Col2, Col3, Col4, Col5, Col6
)
VALUES
(1, 1, 1, 1, 26, 8),
(2, 2, 2, 2, 9, 10),
(4, 4, 4, 4, 30, 3);
ANSI 解决方案
您可以使用ANSI 更新语法解决该问题。ANSI 解决方案如下所示:
UPDATE Table1
SET
Col5 = (
SELECT Col5
FROM Table2
WHERE
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4
),
Col6 = (
SELECT Col6
FROM Table2
WHERE
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4
)
WHERE EXISTS (
SELECT *
FROM Table2
WHERE
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4
);
最终,Table1 中的数据如下所示:
Col1 Col2 Col3 Col4 Col5 Col6
1 1 1 1 26 8
2 2 2 2 9 10
3 3 3 3 25 12
第 1 行和第 2 行已更新,因为 Table2 中有相应的行。第 3 行保持不变,因为表 2 中没有对应的行。
有关工作示例,请参阅我的SQLFiddle。我在 SQLFiddle 上使用了 SQLLite 的 SQL.js 实现。
坦率地说,ANSI 更新语法很烂。它太糟糕了,以至于每个商业数据库引擎都有自己的扩展语法来简化复杂的更新。
我不知道 SQLite 是否有自己的扩展语法或采用了其他数据库引擎的语法。
SQL Server 解决方案
您提到您尝试了 SQL Server 解决方案。
使用 SQL Server 语法,解决方案将如下所示:
UPDATE Table1
SET
Col5 = Table2.Col5,
Col6 = Table2.Col6
FROM Table1
INNER JOIN Table2 ON
Table1.Col1 = Table2.Col1 AND
Table1.Col2 = Table2.Col2 AND
Table1.Col3 = Table2.Col3 AND
Table1.Col4 = Table2.Col4;
不幸的是,SQLite 不理解它:
SQLite exception: 1, near "FROM": syntax error
该解决方案可能仅适用于 SQL Server。当前接受的对链接问题的回答显示了解决 SQL Server、Oracle、MySQL 和 ANSI 问题的不同方法。