2012-09-09 4 views
1

필드 중 하나가 다른 마스터 테이블에 있는지 여부에 따라 하나의 테이블에서 레코드를 제거하는 삭제 쿼리를 만들려고합니다. 새로운 레코드를 데이터베이스로 가져 오는 것이지만 이미 가져온 레코드 인 , 즉 (이미 마스터 테이블에 계정이 있음)을 제거하려고합니다. 그러나 내가 가입해야하는 분야는 동일하지 않습니다 : 그것은 상수 인 3 자 코드 XYZ로 시작됩니다. MS 액세스 삭제 쿼리에서 피하기

tbl_to_import.Account  master_table.Account 
123456     XYZ.123456 
345678     XYZ.345678 

은 내가 다음 시도 삭제 쿼리에 조인을 사용하지 않도록하려면

Delete tbl_to_import.* 
From tbl_to_import 
Where Exists(Select master_table.Account From master_table 
Where master_table.Account = ("XYZ."& tbl_to_import.Account)) = True; 

그러나 쿼리 액세스에 걸려됩니다. 내가 뭘 잘못하고 있는지 모르겠습니다. 오류 메시지가 표시되지 않지만 쿼리가 아무 것도 생성하지 않고 실행되고 결국 중지됩니다. 이 상황에서 tbl_to_import는 2,700 개의 레코드를 가지고 있고 master_table은 50,000 개의 레코드를 가지고 있습니다. 또한 ODBC를 통해 master_table에 연결하고 있습니다.

원래는 삭제를 수행하기 위해 조인을 사용하여 두 개의 쿼리를 생성했습니다. tbl_to_import.Account에는 ID라는 기본 키가 있습니다. tbl_to_import의 ID 번호를 위치 한 쿼리, qry_find_existing_accounts가있는 master_table.Account에 해당 계정이 존재 :

SELECT DISTINCTROW tbl_to_import.ID AS DELETEID 
FROM tbl_to_import LEFT JOIN master_table 
     ON ("XYZ."& tbl_to_import.Account) = master_table.Account 
WHERE ((("XYZ." & [Account])=[master_table].[Account])); 
다음

나는 삭제 쿼리 구성하기 위해이 쿼리를 사용 :

DELETE DISTINCTROW tbl_to_import.*, tbl_to_import.ID 
FROM tbl_to_import RIGHT JOIN qry_find_existing_accounts 
     ON tbl_to_import.ID =qry_find_existing_accounts.DELETEID 
WHERE (((tbl_to_import.ID)=[qry_find_existing_accounts].[DELETEID])); 

을 쿼리 qry_find_existing_accounts은 정상적으로 작동했습니다. 그러나 삭제할 두 번째 쿼리를 실행하려고하면 오류가 발생합니다. 지정한 테이블에서 삭제할 수 없습니다. 일반적으로이 오류가 발생하면 고유 한 레코드 만 선택하지 않았으므로 두 쿼리 모두에서 DISTINCTROW를 사용했습니다.

내가 뭘 잘못하고 어떤 일을 할 수 있는지 아이디어가 있습니까?

답변

1

나는 간단한 중첩 된 SQL 문으로 갈 것 : 계정 필드가 인덱싱 특히

Delete tbl_to_import.* 
From tbl_to_import 
Where "XYZ." & tbl_to_import.Account In 
(Select master_table.Account From master_table); 

이 상당히 빨리해야한다.

+0

내가 속도를 높이기 위해 만든 것은 테이블 생성 쿼리를 사용하여 master_table의 로컬 사본을 작성하는 것이고, 이렇게했을 때 단순히 문자 접두어 만 제거했다. 나는 또한 계정을 로컬 마스터의 기본 키로 만들었고 매우 빨랐다. 감사! – regulus

0

나는 당신이 쿼리를 단순화 할 수 있다고 생각한다; ID가 검색어에 포함되어있는 ID를 기준으로 삭제 :

DELETE * FROM tbl_to_import 
    WHERE tbl_to_import.ID IN (
     SELECT DISTINCT [DELETED] FROM qry_find_existing_accounts 
    )