【问题标题】:SQL - update main table using temp tableSQL - 使用临时表更新主表
【发布时间】:2015-07-31 14:29:31
【问题描述】:

我有一个关于 SQL 的问题,尤其是 SQLite3。我有两张表,我们将它们命名为 main_tabletemp_table。这些表基于相同的关系模式,因此它们具有相同的列但不同的行(值)。

现在我想做的事:

对于main_table 的每一行,如果temp_table 中有一行具有相同的ID,我想替换它。否则我想保留表中的旧行。

我正在考虑使用一些 joins,但它没有提供我想要的东西。

你能给我一个建议吗?

编辑:附加信息:

我想避免写入所有列,因为这些表包含数十个属性,并且由于我必须更新所有列,因此没有必要写出所有列。

【问题讨论】:

  • 没有关于 sqlite 的线索,但它闻起来像是 MERGE 或带有子选择的 UPDATE 的工作。
  • 为什么要进行子选择,@Thomas Tschernich?刚刚更新。
  • 好吧,如果您使用表 B 中的数据更新表 A,您将需要在更新中使用子选择。或者你可以像在 MSSQL 中那样做一个花哨的更新连接,以防它在 sqlite 中被允许。
  • update m set m.col1 = t.col1 ... from main_table m inner join temp_table t on m.id = t.id 更新除id、@Thomas Tschernich 之外的所有列。

标签: python sql sqlite sql-update


【解决方案1】:

如果表结构相同,可以直接使用SELECT *

BEGIN;

DELETE FROM main_table
WHERE id IN (SELECT id
             FROM temp_table);

INSERT INTO main_table
SELECT * FROM temp_table;

COMMIT;

(这还将在temp_table 中添加以前在main_table 中不存在的任何新行。)

【讨论】:

  • 不错!谢谢!优雅的蚂蚁简单的解决方案。
【解决方案2】:

您有两种方法:

  1. 使用来自temp_table 的数据更新main_table 中的当前行。关系将基于 ID。

  2. temp_table 添加一列以标记所有必须转移到main_table 的行,或添加附加表以存储必须转移的IDs。然后从表main_table 中删除所有需要传输的行,并使用带有标记的列或新表从temp_table 中插入相应的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2022-10-05
    • 2017-11-26
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多