2009-07-09 7 views
0

2 간단한 쿼리에 하위 쿼리를 중단하는 방법 :내가 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를가 하위 쿼리에서 잘 수행하고 "excuted 두 개의 SQL 위 (선택 통지하지 않았다고 말한다 sguid = 11) "`두 번, 그래서 아래와 같이 뭔가에 하위 쿼리를 분할하려고하고 싶습니다 tblEvent_basic FROM ROWID는 :

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의 다음 statment에 바인딩하는 방법을 알지 못한다.

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

저는 sqlite3 C API를 직접 사용하고 있습니다.

+1

어떤 환경에서 이것을 부르시겠습니까? 어느 언어 및 데이터베이스 액세스 프레임 워크를 사용하고 있습니까? –

+0

임베디드 시스템에서 sqlite3 C API를 사용하고 있습니다. 데이터베이스 액세스 프레임 워크가 없습니다. – pierrotlefou

답변

1

실제로 CTE (Common Table Expressions)가 필요하지만 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 표는 선택 사항입니다 :

또 다른 옵션은 문을 임시 테이블에서 첫 번째 쿼리의 결과를 저장하고 다음에 해당 테이블을 사용하여 모두 삭제하는 것입니다 데이터베이스 연결 기간.

+0

당신은 "tblEvent_type에서 삭제 어디에서 eguid (선택 rowid 항목에서 FROM)"를 의미합니까? sqlite3에서 "sql이 합법적이지 않은 것 같습니다."(항목)에서 eguid를 삭제하십시오. " – pierrotlefou

+0

@pier : 네 말이 맞아. 나는 그것을 고쳤다. 관련 실수를 복사/붙여 넣기 : –

+0

감사합니다. activa. 나는 너의 방법을 시도했지만, 자존심 수행 능력 향상은 없다. 나는 다른 방법을 시도 할 것이다 .. – pierrotlefou