【问题标题】:SQL Error: Syntax Near "(": syntax error (C++ Interface)SQL 错误:语法接近“(”:语法错误(C++ 接口)
【发布时间】:2014-01-06 15:22:29
【问题描述】:

我正在尝试在我的 C++ 程序中运行 SQLite 查询,以删除我的一个数据库表中的所有重复记录。但是,我不断遇到各种语法错误。

这是我的 SQL 表:

Table Name: spamtrigrams

ID          TRIGRAM       
----------  ----------  
1           Sam's nice ham        
2           Tuesday was cold       
3           Alex stood up
4           Mark passed out      
5           this database is
6           date with a
7           disco stew pot
++10000 

这是我的 C++ 代码:

  sql = "DELETE from spamtrigrams WHERE id in(" \
    "SELECT id from spamtrigrams" \
    "EXCEPT(SELECT min(id);"  \
    "from spamtrigrams," \
    "group by TRIGRAM," \
    "having count(1) > 1," \
    "union all," \
    "SELECT min(id)," \
    "from spamtrigrams," \
    "group by TRIGRAM," \
    "having count(1) = 1));";
ret = sqlite3_exec(db, sql.c_str(), NULL, 0, &zErrMsg);
if (ret != SQLITE_OK) {
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
}
else {
    fprintf(stdout, "Duplicates Deleted\n");

有人能告诉我为什么会出现这个错误吗?

谢谢。

【问题讨论】:

  • 您知道您的if 中缺少}。不过,这不是您的错误:只是发布错字。
  • 认真的吗?需要我们为您计算括号吗?
  • 括号的数量似乎匹配,但我认为逗号有很多。也许 SQLite 不同,但 IIRC,FROM、GROUP 或 HAVING 之前通常没有逗号。哦,还有“;”第三行之后肯定是错的。
  • 这与 C++ 无关。 only 用 SQL 来提问,因为这是一个查询语法错误。

标签: c++ sql sqlite


【解决方案1】:

您似乎遗漏了一些空格,并且到处都有多余的字符:

sql = "DELETE from spamtrigrams WHERE id in(" \
"SELECT id from spamtrigrams" \ // <<= Here's a missing space
"EXCEPT(SELECT min(id);"  \     // <<= Here's an extra semicolon
"from spamtrigrams," \          // <<= Here's an extra comma
"group by TRIGRAM," \           // <<= Here's an extra comma
"having count(1) > 1," \        // <<= Here's an extra comma
"union all," \                  // <<= Here's an extra comma
"SELECT min(id)," \             // <<= Here's an extra comma
"from spamtrigrams," \          // <<= Here's an extra comma
"group by TRIGRAM," \           // <<= Here's an extra comma
"having count(1) = 1));";

在 C++ 中,当您将两个字符串文字放在一起时,仅由空格分隔,编译器会将它们视为单个文字。因此,可以在每行的末尾去掉反斜杠(或者在每行的末尾去掉双引号,如果你喜欢这样的话)。

【讨论】:

  • 我真的不明白 - 我无法让它超过第一行,它似乎不喜欢第一个 '(' ...?
【解决方案2】:

不知道这是否是您的(唯一)问题,或者,如果这是发布问题时的拼写错误,但您在 "EXCEPT(SELECT min(id);" 中有多余的 ;

这是在参考答案中提到的缺失空格的补充,而我正在写这个

【讨论】:

    【解决方案3】:

    问题不在于字符串连接,而在于查询的逗号数量。无论您使用什么 DBMS,您都不必放置这么多逗号和 ';'在SELECT min(id) 中(这被视为SELECT 语句的结尾)。

    因此,DBMS 引擎无法识别该语句并打印语法错误。

    您的 C++ 程序中的查询应如下所示:

    sql = "DELETE from spamtrigrams WHERE id in(" \
        "SELECT id from spamtrigrams " \
        "EXCEPT(SELECT min(id) "  \
        "from spamtrigrams " \
        "group by TRIGRAM " \
        "having count(1) > 1 " \
        "union all " \
        "SELECT min(id) " \
        "from spamtrigrams " \
        "group by TRIGRAM " \
        "having count(1) = 1));";
    

    此外,不要忘记在关键字和标识符之间添加一个空格。

    【讨论】:

    • 还需要在关键字和标识符之间添加空格。
    • 感谢 Alberto - 我将您的代码粘贴到我的函数中,但仍然出现相同的错误。知道出了什么问题吗?
    • @TheBlueNile 我不知道。在发布答案之前,我测试了查询并且我没有任何问题,就像你的括号一样。你确定你仍然有同样的语法错误吗?
    • @AlbertoSolano 是的,仍然是同样的错误。我将放弃该函数,只使 TRIGRAM 列中的数据唯一,以便将来的插入将在尝试将任何重复值添加到表中时引发错误。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多