【问题标题】:SQLite query gives different resultsSQLite 查询给出不同的结果
【发布时间】:2014-06-18 08:28:53
【问题描述】:

我正在用 C 语言开发一个小型应用程序,我想使用 SQLite 对数据库执行一些查询。问题是我的行为很奇怪。

如果我在 Firefox 插件“SQLite Manager”上的同一个数据库上运行相同的查询,我会得到预期的结果,但如果我通过程序中的 C 接口运行它,我会得到结果元组的错误顺序。

你可以找到数据库here(CSV或SQLite格式),而有问题的查询是这个:

SELECT name, slot, id, species_id 
FROM type_names T, pokemon_types PT, pokemon P 
WHERE T.type_id = PT.type_id 
AND P.id = PT.pokemon_id AND T.local_language_id = 9 
AND P.identifier LIKE '%char%' 
ORDER BY P.species_id;

在 Firefox 上我得到了预期的结果:

+--------+------+--------+------------+ |姓名 |插槽 |编号 |物种_id | +--------+------+--------+------------+ |火灾 | 1 | 4 | 4 | |火灾 | 1 | 5 | 5 | |火灾 | 1 | 6 | 6 | |飞行 | 2 | 6 | 6 | |火灾 | 1 | 10034 | 6 | |龙 | 2 | 10034 | 6 | |火灾 | 1 | 10035 | 6 | |飞行 | 2 | 10035 | 6 | |火灾 | 1 | 390 | 390 | +--------+------+--------+------------+

在 C 中我得到这个:

+--------+------+--------+------------+ |姓名 |插槽 |编号 |物种_id | +--------+------+--------+------------+ |火灾 | 1 | 4 | 4 | |火灾 | 1 | 5 | 5 | |飞行 | 2 | 6 | 6 | |飞行 | 2 | 10035 | 6 | |火灾 | 1 | 6 | 6 | |火灾 | 1 | 10034 | 6 | |火灾 | 1 | 10035 | 6 | |龙 | 2 | 10034 | 6 | |火灾 | 1 | 390 | 390 | +--------+------+--------+------------+

我还尝试了一些仅使用该查询访问数据库的简单代码,但我总是遇到同样的问题,代码如下:

#include <stdio.h>
#include <sqlite3.h>

// argument 1 is path to db, argument 2 is query

static int callback(void *NotUsed, int argc, char **argv, char **azColName){

    int i;
    for(i=0; i<argc; i++){
        printf("%s\t", argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char **argv){
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

    if( argc!=3 ){
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
        return(1);
    }
    rc = sqlite3_open(argv[1], &db);
    if( rc ){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }
    rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
    if( rc!=SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    sqlite3_close(db);
    return 0;
}

【问题讨论】:

  • 您需要发布代码以获得足够的帮助
  • 我编辑了我的问题,试图使代码尽可能简单。
  • 在 SELECT 子句中包含 P.species_id 时的输出是什么?
  • 已编辑表格,包括species_id。
  • 似乎您期望:从 type_names T、pokemon_types PT、pokemon P WHERE T.type_id = PT.type_id AND P.id = PT.pokemon_id AND T 中选择名称、插槽、id、species_id。 local_language_id = 9 AND P.identifier LIKE '%char%' ORDER BY P.species_id, id, slot ASC;

标签: sql c database sqlite


【解决方案1】:

看起来你在期待:

SELECT name, slot, id, species_id 
FROM type_names T, pokemon_types PT, pokemon P 
WHERE T.type_id = PT.type_id 
AND P.id = PT.pokemon_id 
AND T.local_language_id = 9 
AND P.identifier LIKE '%char%' ORDER BY P.species_id, id, slot ASC;

进一步使您的 ORDER BY 能够准确复制结果。

【讨论】:

    【解决方案2】:

    ORDER BY 子句的全部内容是ORDER BY P.species_id。因此,两个输出都是 100% 正确的(它们都按 P.species_id 值升序排序)。如果您希望按其他列对结果进行排序,则需要在 ORDER BY 子句中包含这些列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-04
      • 2013-06-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多