2009-07-09 204 views
0

我想一些方法來優化下面的SQL語句:如何打破子查詢到2個簡單的查詢

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 excuted「(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(result)綁定到sqlite中的follwing statment。

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

我直接使用sqlite3 C API。

+1

你從什麼環境調用這個?你使用哪種語言和數據庫訪問框架? – 2009-07-09 11:24:46

+0

我在嵌入式系統上使用sqlite3 C API。沒有數據庫訪問框架。 – pierrotlefou 2009-07-09 12:14:19

回答

1

實際上你需要公用表表達式(CTE),但SQLite不支持這種表達式。

另一種選擇將是第一個查詢的結果存儲在一個臨時表中,然後使用該表中都delete語句:

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是可選的,因爲表只存在了連接到數據庫的持續時間。