0

次の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 はサブクエリでうまく機能しなかったと言われており、上記の 2 つの sql が "(SELECT rowid FROM tblEvent_basic WHERE sguid=11)"` を 2 回実行していることに気付いたので、サブクエリを次のように分割してみます。

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)

どうすればこれを達成できますか?パラメーター (結果) を sqlite の次のステートメントにバインドする方法がわかりません。

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

sqlite3 C API を直接使用しています。

4

1 に答える 1

1

実際には Common Table Expressions (CTE) が必要ですが、SQLite ではサポートされていません。

もう 1 つのオプションは、最初のクエリの結果を一時テーブルに格納し、そのテーブルを両方の削除ステートメントで使用することです。

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 はオプションです。

于 2009-07-09T12:18:51.147 に答える