2010-02-03 3 views
16

저기있는 모든 강력한 SQLsuperheros에게 안녕하세요. 누구든지 저의 긴급한 재난과 파멸에서 구해낼 수 있습니까?엔트리가 다른 테이블에없는 경우 테이블에 레코드를 삽입하십시오. 추가 트위스트를 사용하십시오.

Microsoft Access SQL을 사용하고 있습니다. 하나의 테이블 (table1)에서 다른 테이블 (table2)에 나타나지 않는 레코드를 선택하고 다음과 같이 table1의 레코드를 기반으로하는 새 레코드를 table2에 삽입합니다.

[table1] file_index : 파일명

[표 2] file_index : celeb_name

I는 할

[파일명] AUD 같은 곳

이 표에서의 모든 레코드를 선택하고, 그 대응 [file_index] 값 필드 [celeb_name] = '오드리 햅번'

내가 다음 [표 2]

[file_index] = [표 1]에 새 레코드를 삽입 할 해당 선택으로. file_index와 함께 표 2에 존재하지 않습니다 ] [celeb_name] = '오드리 헵번'

[표 1]과 [표 2] [표 1]에 다수의 [표 2 한 레코드]에서 [file_index] 사이의 관계에 많은 일이있다.

많은 감사합니다.

답변

14

이렇게 할 수 있습니까? 분명히 대괄호와 대괄호를 추가하십시오. 나 자신도 Access에 들어간다.

INSERT INTO table2 (file_index, celeb_name) 
SELECT file_index, 'Audrey Hepburn' 
FROM table1 
WHERE filename = 'aud' 
    AND file_index NOT IN (SELECT DISTINCT file_index 
         FROM table2 
         WHERE celeb_name = 'Audrey Hepburn') 
+0

Tor - 이름에서 알 수 있듯이 진정한 SQL 신입니다. 정말 고맙습니다. 그것은 작동했다. – bonzo46

+0

NOT IN은 Jet/ACE에서 잘 최적화되지 않았다. 종종 양쪽에서 인덱스를 사용하거나 (경우에 따라 양쪽에서) 인덱스를 사용하지 않기 때문이다. 그리고 OUTER JOIN은 조인 된 필드가 인덱싱되면 항상 인덱스를 사용하기 때문에 훨씬 더 안정적입니다. –

+4

@ David-W-Fenton - 액세스를 사용하고 성능을 기대하는 사용자는 누구나 다른 곳에 표시되어야합니다 ...) –

0

원래 질문에서 테이블과 필드 이름을 수정하고 읽기 쉽도록 대괄호를 삽입했습니다.

다음은 MS Access 형식으로 작동 한 최종 SQL 문입니다. 굉장한 결과, 다시 감사합니다 Tor !! 나는이 의견에 말했듯이

INSERT INTO photos_by_celebrity (ORIG_FILE_INDEX, celebrity_name) 

SELECT tblOriginal_Files.ORIG_FILE_INDEX, 'Audrey Hepburn' AS Expr1 

FROM tblOriginal_Files 

WHERE (((tblOriginal_Files.ORIG_FILE_INDEX) Not In (SELECT DISTINCT ORIG_FILE_INDEX 

         FROM photos_by_celebrity 

         WHERE celebrity_name = 'Audrey Hepburn')) AND ((tblOriginal_Files.ORIGINAL_FILE) Like "*aud*")); 
+0

죄송합니다. 초기 편집이 완전히 잘못되었으므로 부주의로 번역이되었습니다. 나는 그것을 고치고 나의 질문을 위의 것으로 바꿨다. – bonzo46

1

, NOT IN은 제트/ACE에 의해 잘 최적화 그것은 외부 조인을 사용하는 것이 더 효율적되지 않습니다. 이 경우, 때문에 당신은 하위 쿼리가 필요합니다, 조인의 외측에 필터링 할 필요가 정확히 맞지 않을 수 있습니다 (

INSERT INTO photos_by_celebrity (ORIG_FILE_INDEX, celebrity_name) 
    SELECT tblOriginal_Files.ORIG_FILE_INDEX, 'Audrey Hepburn' 
    FROM tblOriginal_Files 
    LEFT JOIN (SELECT DISTINCT ORIG_FILE_INDEX 
        FROM photos_by_celebrity 
        WHERE celebrity_name = 'Audrey Hepburn') AS Photos 
    ON tblOriginal_Files.ORIG_FILE_INDEX = Photos.ORIG_FILE_INDEX 
    WHERE Photos.ORIG_FILE_INDEX Is Null; 

을 - 나는 손으로 쓰는 SQL 끔찍한 해요, 특히 조인 구문 오른쪽 가져 오기)

너무 많은 레코드를 삽입합니다 (그리고 동일한 예약 NOT IN 버전 적용됩니다), 나는 말을해야합니다.

관련 문제