2014-01-06 4 views
-5

Я пытаюсь запустить SQLite Query в моей программе на C++, которая удаляет все повторяющиеся записи в одной из моих таблиц базы данных. Однако я продолжаю сталкиваться с различным синтаксисом . ошибкиОшибка SQL: синтаксис Near "(": синтаксическая ошибка (интерфейс C++)

Вот мой 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"); 

ли кто-нибудь сможет сказать мне, почему эта ошибка возникает

?

Спасибо.

+0

Вы знаете, что в '' '' '' отсутствует '' '. Это не ваша ошибка: просто опечатка. – Bathsheba

+0

Серьезно? Хотите, чтобы мы подсчитали скобки для вас? – Paranaix

+0

Число скобок, похоже, соответствует, но я думаю, что есть много запятых. Может быть, SQLite отличается, но IIRC, обычно нет запятой до FROM, GROUP или HAVING. О, и ";" после третьей строки, безусловно, неправильно. – PMF

ответ

5

Похоже, вам не хватает некоторых пробелов и дополнительные символы здесь и там:

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++, когда вы положили две строковые литералы вместе, разделены только пробелами, компилятор обрабатывает их как одиночный литерал. Поэтому в конце каждой строки можно отбросить обратную косую черту (или сбросить двойные кавычки в конце каждой строки, если вам это нравится).

+0

Я действительно не получаю это - я не могу заставить его работать за первой строкой, ему, похоже, не нравится первая '(' ...? – TheBlueNile

1

не знает, если это ваши (только) проблемы, или, если это опечатка в проводке вопроса, но у вас есть избыточные ; в "EXCEPT(SELECT min(id);"

это в дополнении к недостающим пространствам, указанным в референте ответ, пока я писал этот

1

Проблема не в конкатенации строк, а в числе запятых запроса. Независимо от того, какую СУБД вы используете, вам не нужно класть так много запятых, а ';' в SELECT min(id) (это видно как конец SELECT).

По этой причине механизм СУБД не распознает инструкцию и печатает синтаксическую ошибку.

Ваш запрос, в программе 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));"; 

Кроме того, не забудьте добавить пробел между ключевыми словами и идентификаторов.

+0

Нужно добавить пробелы между ключевыми словами и идентификаторами. – laalto

+0

@laalto Да, спасибо! –

+0

Спасибо Alberto - я вставил ваш код в свою функцию, но та же ошибка все еще возникает. Любая идея, что пошло не так? – TheBlueNile

Смежные вопросы