我有一张看起来像这样的表:
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;}
}
答案 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