2009-09-22 4 views
2

많은 행을 데이터베이스에 일괄 가져 오기위한 코드를 작성하려고합니다.내 SQL 삽입/업데이트 문이 너무 비효율적입니다.

현재 원시 데이터 (.csv 파일에서)를 스테이징 테이블로 대량 복사하므로 모든 데이터가 데이터베이스 측에 있습니다. 그러면 '연락처'를 식별하는 행이 가득한 준비 테이블이 나에게 남습니다. 이제는 이들을 데이터베이스의 다른 테이블로 옮겨야합니다.

다음으로 나는 아직 연락처 테이블에없는 스테이징 테이블의 행을 복사하고 이미 가지고있는 스테이징 테이블의 경우 "GroupToBeAssignedTo"라는 컬럼을 업데이트해야 나중에 작업을 나타낼 수 있습니다 나는 수행 할 것이다.

나는이 잘못에 대해 생각하고 있습니다. 쿼리가 효율적이지 않고 어떻게하면 더 잘 수행 할 수 있는지에 대한 조언을 찾고 있습니다.

update [t1] 
set [t1].GroupToBeAssignedTo = [t2].GroupToBeAssignedTo from Contacts [t1] 
inner join ContactImportStaging [t2] on [t1].UserID = [t2].UserID AND [t1].EmailAddress = [t2].EmailAddress AND [t2].GUID = @GUID 
where not exists 
(
    select GroupID, ContactID from ContactGroupMapping 
    where GroupID = [t2].GroupToBeAssignedTo AND ContactID = [t1].ID 
) 

는 이후 데이터 다음 '깨끗한'단지 첫 번째 중복 확인하지 않고 모든 행을 가져올 더 나은하고 있는가? 내가 어디로 잘못 가고 있는지 제안을 찾고. 감사.

편집 : 명확히하기 위해 MS SQL에 관한 질문입니다.

답변

0

다음은 내가 이미 접촉 테이블에없는 준비 테이블의 행을 복사

ContactGroupMappingContacts.id 일치하는 기록이없는 것을 의미 보이는 경우를의

UPDATE [t1] 
SET  [t1].GroupToBeAssignedTo = [t2].GroupToBeAssignedTo 
FROM Contacts [t1] 
INNER JOIN 
     ContactImportStaging [t2] 
ON  [t1].UserID = [t2].UserID 
     AND [t1].EmailAddress = [t2].EmailAddress 
     AND [t2].GUID = @GUID 

아니면 내가 놓친 거지 뭔가 : 그냥 EXISTS를 생략 할 수 있습니다?)

당신이 MS의 SQL Server 2005 Standard 또는 Enterprise 버전을 가지고 있다면, 그리고,

1

이 대답은 "나는 여기에서 시작되지 것입니다"하지만 내가 그것을하려는 방법이 약간있다 당신은 SQL Server Integration Services에 접근 할 수 있습니다. 이런 종류의 일은 데이터 흐름과 관련이 있습니다.

  • ...
  • (그것이 어떤 분야로 분류되어있어 경우가 빠릅니다) CSV 파일에 연결된 데이터 소스를 작성하고 기존 연락처 테이블에 대한 또 다른 (같은 분야하여 정렬 ORDER BY를 사용)
  • 하는 것은 병합 공통 필드에 가입 금지 - 중 두 가지 소스가 이미
  • 정렬되지 않은 경우에만 이미 수 없습니다 행에 초점을 조건부 분할을 수행합니다 정렬 변환을 사용해야합니다 테이블 (즉, 테이블 고유 필드가 "null", 즉 병합 조인이 실제로 해당 행에 병합되지 않았습니다)
  • OLEDB 대상을 사용하여 테이블에 입력하십시오.

단일 insert-with-select 문보다 개별 단계가 더 많을 수 있지만 스테이징은 저장되지 않으므로 따라하기가 쉽습니다. 게다가 이미 사용 허가를 받았을 것이므로 매우 쉽습니다.

관련 문제