2009-07-09 194 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是可选的,因为表只存在了连接到数据库的持续时间。