使用c ++中的sqlite3命令对表进行排序,添加和剪切

时间:2013-12-13 17:46:15

标签: c++ sql sqlite

我有一张看起来像这样的表:

id | amount | value
1  |   2    |   3
2  |   4    |   5
3  |   2    |   4

首先,我想按值对表进行排序:然后我想在增加的金额大于某个max_amount时剪切表格。

现在我有一个常规做法。它应该如何工作: 它基本上查看每一行,比较added_amount是否大于max_amount。如果不是,则将条目写入另一个新表中,如果是,则取差异(max_amount - added_amount)将其放入新表中然后返回。 之后,我删除旧表的条目,并将新表中的数据传输到旧表中。

结果(对于max_amount = 5):

id | amount | value
1  |   2    |   3
3  |   2    |   4
2  |   1    |   5

看起来相当复杂,有点慢。因此,我希望找到一种更简单的方法。我想知道是否有一个SQLITE3命令,或者至少是一种更聪明的方式:)

希望有人有个主意! :d

~AMK

编辑(c ++函数看起来像这样):

    while(1)
{
    id = id + 1;

    sql = "SELECT * FROM table ORDER BY value ASC LIMIT 1 OFFSET ?";

    sqlite3_stmt *stmt;

    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "Can not prepare: %s\n", sqlite3_errmsg(db));
        sqlite3_finalize(stmt);
        exit(0);
    }

    rc = sqlite3_bind_int(stmt, 1, id);
    if (rc != SQLITE_OK) 
    {
        fprintf(stderr, "Can not bind: %s\n", sqlite3_errmsg(db));
        sqlite3_finalize(stmt);
        exit(0);
    }
    rc = sqlite3_step(stmt);
    (...)
    value = sqlite3_column_int(stmt, 0);
    value1 = sqlite3_column_double(stmt, 1);
    value2 = sqlite3_column_double(stmt, 2);
    sqlite3_finalize(stmt);

    sql = "INSERT OR REPLACE INTO table_new (id, amount, value) values (?,?,?)";
    amount_added = amount_added + value1;
    if(amount_added >= amount_max)
    {
        value1 = value1 - (amount_added - amount_max);
                    done = 1;
    }

    rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    rc = sqlite3_bind_int(stmt, 0, value);
    rc = sqlite3_bind_int(stmt, 1, value1);
    rc = sqlite3_bind_int(stmt, 2, value2);
    rc = sqlite3_step(stmt);
    sqlite3_finalize(stmt);

    (... put table_new data into table)

            if(done == 1){return = 0;}
}

2 个答案:

答案 0 :(得分:1)

首先,看看这个answer并根据你的情况进行调整:

int main() {
  std::string query = "SELECT *  FROM table WHERE amount > 5 ORDER BY value ASC"; 
  system("connectDB.sh " + query.c_str()); 
  /* connectDB.sh should be chmod +x */
}

您的脚本将是:

#!/bin/bash
sqlite3 test.db ${1}

修改

如果你在linux平台上工作,你必须创建一个文件,例如:

connectDB.sh

并复制/粘贴这两行:

#!/bin/bash
sqlite3 test.db ${1}

第一行:你正在使用bash
第二行:在test.db文件上执行sqlite3程序传递$ {1},当你调用“connectDB”时第一个参数select * from t“”:在这种情况下$ {1} =“select * from t”

记得给文件执行权限:

 chmod +x connectDB.sh

来自您的主要

system("connectDB.sh " + query.c_str()); 

对文件connectDB.sh执行系统调用,并使用您的查询传递字符串。

我希望我很清楚..

答案 1 :(得分:0)

我发现为什么这个例程很慢。它在sqlite-faq https://sqlite.org/faq.html(19)中进行了解释。 交易速度取决于您的硬盘:

  

事务通常需要两个完整的磁盘盘旋转,这在7200RPM磁盘驱动器上限制您每秒约60个事务。

因此,您可以使用“BEGIN ... COMMIT”将其固定。

除此之外,您当然可以将两个陈述合并为一个...... 使用“INSERT OR UPDATE ... SELECT ...”(与速度无关)

我得出结论,你必须使用某种例程来削减它并且几乎可以肯定,你不能用某种sqlite语句替换这个例程。

感谢您的帮助。

~AMK