c++ - 使用 sqlite 和 c++ 对数据库表进行实际排序的最佳方法?

标签 c++ sorting sqlite

我需要对表格进行永久排序。我无法控制数据库或表的创建方式。我有一个用 C++ 编写的程序,它有几种方法可以对数据库及其表执行不同的操作。例如打印、调用行、更新行、下载行、更新行等等。

我目前正在对数据库进行排序。它需要根据指定的列实际对数据库进行排序,并且如果用户指定一个列,则可以按另一列进行子排序。因此,如果使用第三方应用程序查看排序完成后,所有数据都会显示为已排序。

我知道 SELECT * FROM table1 ORDER BY Col1,Col2 会返回已排序的表,但从实际内存的角度来看,所有数据都是表仍然是相同的,所以如果 col 1 在 ORDER BY 之后全部乱序数据库查看器仍然会显示 col 1 全部乱序。排序后,数据库中的数据应该被排序,当在数据库查看器中查看时,一切都是有序的。

这是对我的第一篇文章的完整编辑。仅供引用

最佳答案

在@RogerRowland 的帮助下,我解决了这个问题,但对于那些想和我做同样事情的人来说。我不知道为什么你真的想要这样做,但如果你需要实际对数据库表的数据进行排序而不是仅仅返回排序后的数据并且正在使用 sqlite3 和 c++ 这就是你想要做的。

步骤 1)

rc = sqlite3_prepare(this->dbPointer, "CREATE [TEMP] VIEW tempViewOfSortedTable AS SELECT * FROM tableName ORDER BY columnName", -1, &ppStmt, NULL);

步骤 2) 获取所有表信息(列名和类型等)并将其存储在一个字符串中。

rc = sqlite3_prepare_v2(this->dbPointer, "pragma table_info tableName", -1, &ppStmt, NULL);

第 3 步)创建一个与原始表具有相同列和属性的新表。

sprintf(strQuery, "CREATE TABLE tempUserTable (%s)", strListOfFieldsAndTypes);
if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, strQuery, NULL, NULL, &errMsg);

第 4 步)将 View 的所有排序数据复制到新表中。

sprintf(strQuery, "INSERT INTO tempUserTable SELECT %s FROM tempViewOfSortedTable", strListOfFields);
if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, strQuery, NULL, NULL, &errMsg);

第 5 步)删除旧表

if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, "DROP TABLE tableName", NULL, NULL, &errMsg);

第 6 步)根据需要将新表重命名为旧名称。

if (rc == SQLITE_OK)rc = sqlite3_exec (this->dbPointer, "ALTER TABLE tempUserTable RENAME TO 'tableName'", NULL, NULL, &errMsg);

如果您没有创建临时 View ,或者即使您要在关闭数据库之前重复此操作,您可能还想删除该 View ,因为如果您不这样做,临时 View 会持续到您关闭数据库。

也一定不要声称这是最快的路线。我使用 sqlite3_exec 的唯一原因是因为我回收了别人的旧代码,我将自己用 sqlite3_prepare_v2 替换它,但想为其他有同样问题的人解决这个问题。

来源。

http://www.sqlite.org/lang_createview.html

http://www.sqlite.org/capi3ref.html

关于c++ - 使用 sqlite 和 c++ 对数据库表进行实际排序的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20972989/

相关文章:

sorting - Dafny 中的选择排序

python - 字典中的总和值小于某个值

android - 从 sqlite 中获取的阿拉伯字符串在 android 中显示不正确?

java - Helloworld 数据库 - android 与 sqlite 的连接

c++ - 创建一个接受 2 个输入参数的文字运算符函数

c++ - 如何在 C++ 中将 std::string 转换为 const char

已删除对象的 C++ 引用

c++ - 将值传递给 main(int, char**)

arrays - 优化算法安排一个数组,其中偶数索引的项目在数组的左侧,奇数索引的项目在数组的右侧

ios - Swift - SharkORM 忽略并加密属性