我有两个具有相同架构的表。我们将它们命名为TestTable和TestTableTemp。我只需要将两列从TestTableTemp复制到TestTable,而不会破坏其他数据。 TestTable中的行是TestTableTemp中的行的子集。假设我需要复制的列分别命名为Column1和Column2,并且它们具有相同的主键,这些主键被列primaryKey引用。
我相信在mysql中可以这样或类似地完成此操作:
UPDATE TestTable, TestTableTemp
SET TestTable.Column1 = TestTableTemp.Column1, TestTable.Column2 = TestTableTemp.Column2
WHERE TestTable.primaryKey = TestTableTemp.primaryKey
Sqlite不允许在update语句上定义多个表,如在其参考数据中所示:http://www.sqlite.org/lang_update.html
我能想到的最好的是这样的:
UPDATE TestTable SET
Column1 = (select TestTableTemp.Column1 from TestTableTemp, TestTable where TestTable.primaryKey = TestTableTemp.primaryKey),
Column2 = (select TestTableTemp.Column2 from TestTableTemp, TestTable where TestTable.primaryKey = TestTableTemp.primaryKey)
WHERE EXISTS(select * from TestTableTemp where TestTable.primaryKey = TestTableTemp.primaryKey"
这使我在“附近”出现语法错误。我猜这是因为我无法在标量表达式中引用TestTable。
谁能指出我正确的方向?任何帮助深表感谢。
编辑:
我清理了第二个查询。似乎只是将Column1和Column2设置为TestTableTemp中该列的第一行。
最佳答案
您的原始查询以供比较:
UPDATE TestTable, TestTableTemp
SET TestTable.Column1 = TestTableTemp.Column1
, TestTable.Column2 = TestTableTemp.Column2
WHERE TestTable.primaryKey = TestTableTemp.primaryKey
这是有效的查询(我只是稍微更改了您的版本):
http://sqlfiddle.com/#!5/f3a19/9
UPDATE TestTable
SET
Column1 = ( SELECT TestTableTemp.Column1
FROM TestTableTemp
WHERE TestTableTemp.primaryKey = TestTable.primaryKey )
,Column2 = ( SELECT TestTableTemp.Column2
FROM TestTableTemp
WHERE TestTableTemp.primaryKey = TestTable.primaryKey )
WHERE EXISTS( SELECT NULL
FROM TestTableTemp
WHERE TestTableTemp.primaryKey = TestTable.primaryKey )
;