Как разбить подзапрос на 2 простых запроса - PullRequest
0 голосов
/ 09 июля 2009

Я пытаюсь каким-то образом оптимизировать следующий SQL-оператор:

exe_sql "DELETE FROM tblEvent_type WHERE eguid in (SELECT rowid FROM tblEvent_basic WHERE sguid=11);";
exe_sql "DELETE FROM tblEvent_group WHERE eguid in (SELECT rowid FROM tblEvent_basic WHERE sguid=11);";

Говорят, что sqlite3 не очень хорошо работал в подзапросе, и обратите внимание, что более двух sql оправдано "(SELECT rowid FROM tblEvent_basic WHERE sguid = 11)" `дважды, поэтому я хотел бы попытаться разбить подзапрос на что-то вроде ниже:

result =  exe_sql "(SELECT rowid FROM tblEvent_basic WHERE sguid=11);";
          exe_sql "DELETE FROM tblEvent_type WHERE eguid in  (result)
          exe_sql "DELETE FROM tblEvent_group WHERE eguid in (result)

Как можно этого достичь? Я понятия не имею, как получить привязку parmater (результата) к следующему утверждению в sqlite.

"DELETE FROM tblEvent_group WHERE eguid in (?) #how to bind result here

Я использую sqlite3 C API напрямую.

1 Ответ

1 голос
/ 09 июля 2009

На самом деле вам нужны Common Table Expressions (CTE), но это не поддерживается в SQLite.

Другой вариант - сохранить результат первого запроса во временной таблице, а затем использовать эту таблицу в обоих операторах удаления:

CREATE TEMP TABLE items AS SELECT rowid FROM tblEvent_basic WHERE sguid=11

DELETE FROM tblEvent_type WHERE eguid in  (select rowid from items)
DELETE FROM tblEvent_group WHERE eguid in (select rowid from items)

DROP TABLE items

DROP TABLE является необязательным, поскольку таблица существует только на время соединения с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...