【问题标题】:replace column values of table if exists如果存在则替换表的列值
【发布时间】:2014-09-06 01:25:14
【问题描述】:

我有两张桌子:

Main:

Id    | Count | Type
name1    3       1
name2    5       2
...

Temp:
Id     |Count|
name1     7
name3     2

如果两个表中都存在Id,我想更新Main 表的Count 列。

所以对上面的例子做了一些操作后,结果应该是:

Main:
Id    | Count | Type
name1    7       1
name2    5       2

我当前的代码是:

QSqlQuery search_query = database_.exec("SELECT * From Temp");
while (search_query.next()){
    database_.exec("UPDATE Main"
        " SET Count=" + search_query.value(1).toString() +
        " WHERE Id = '" + search_query.value(0).toString() + "' ;");
}
database_.exec("DELETE FROM Temp");

它工作正常,但速度很慢!! (500 行需要 2-3 分钟!!)

我正在寻找更有效的方法。我该怎么办?

【问题讨论】:

  • 您应该使用JOIN 并在一个语句中执行UPDATE。顺便说一句,你使用 sqlite 或 MySQL 还是两者兼而有之?
  • @VMai 两个都可以用
  • @omid - 我建议在编写内联 SQL 查询之前,先在查询程序中尝试它们。这样,您就不会浪费时间试图找出使用 C++ 程序的最佳方法。

标签: c++ mysql qt sqlite


【解决方案1】:

在 UPDATE 语句中,您可以使用相关子查询查找新值:

UPDATE Main
SET Count = (SELECT Count FROM Temp WHERE Id = Main.Id)
WHERE Id IN (SELECT Id FROM Temp)

【讨论】:

    【解决方案2】:

    调用单个更新脚本到数据库怎么样?

    UPDATE Main m
    INNER JOIN Temp t ON
        m.Id = t.Id
    SET m.Count = t.Count
    

    【讨论】:

    • 啊,我明白了。这个想法就在那里。您的子查询应该可以正常工作:)
    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2018-07-07
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多