我有两个具有相同架构的表。我们将它们命名为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 )
;

10-06 07:57