用sqlite和c++对数据库表进行排序的最佳方法是什么

Best way to actually sort a database table with sqlite and in c++?

本文关键字:排序 最佳 是什么 方法 sqlite c++ 数据库      更新时间:2023-10-16

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

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

我知道SELECT*FROM table1 ORDER BY Col1,Col2会返回排序后的表,但从实际的内存立场来看,所有数据都是一样的,所以如果ORDER BY之后col 1都乱了,数据库查看器仍然会显示col 1。排序后,应该对数据库中的数据进行排序,当在数据库查看器中查看时,所有数据都按顺序排列。

这是我第一篇文章的完整编辑。fyi

通过@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)将视图的所有排序数据复制到新表中。

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);

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

此外,无论如何不要声称这是一条快速路线。我使用sqlite3_exec的唯一原因是,我回收了其他人的旧代码。我将自己用sqlite3_prepare_v2替换它,但我想为其他有同样问题的人解决这个问题。

来源。

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

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