2012-11-22 3 views
0

두 개의 테이블 A와 B (동일한 스키마 포함)가 있으며 A의 모든 항목을 B에 병합하여 병합하려고합니다. B 테이블에 이미 A의 키를 누르면 해당 데이터를 자동으로 삭제하려고합니다.고유 한 키가 여러 개의 열로 구성된 두 테이블 병합

문제는 표 B에는 세 개의 열로 구성된 고유 키 색인이 있으므로 "WHERE A.key <> B.key"이라고 말할 수는 없습니다.

내가의 라인을 따라 SQL 문을 공식화 수없는 것 :

INSERT INTO B 
VALUES ((SELECT * FROM A WHERE ... NOT IN ...)) 

를 대응하는 세 개의 열 키가 존재하지 않는 B에 A로부터 INSERT 해당 행에 방법이 있나요 아직 B?

+0

두 테이블의 열을 알려주세요. – Chella

+0

@Chella : 이름이나 해당 유형이 필요합니까? – Philip

답변

2
INSERT INTO B 
(Col1, Col2, Col3, ColN) 
SELECT 
A.Col1, A.Col2, A.Col3, COlN 
FROM A 
LEFT JOIN B 
ON A.COL1 = B.Col1 
AND A.COL2 = B.Col2 
AND A.COL3 = B.Col3 
WHERE B.Col1 IS NULL 

은 기본적으로 가입 왼쪽에 2 개 개의 테이블을 가입하고, B는

+0

영리한 아이디어, 그리고 완벽하게 작동합니다. 감사! – Philip

1

당신은 NOT EXISTS를 사용할 수의 (a 3 키 열에 가입에 대한 B의 테이블에 대응하는 값) 널 (null)입니다 어디에서 모든 삽입 대신

INSERT B 
SELECT * 
FROM A 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM B 
      WHERE A.Key1 = B.Key1 
      AND  A.Key2 = B.Key2 
     ) 

this에 따라 MySQL을하지 않는 것보다 LEFT JOIN/IS NULL 더 나은 최적화 있지만 NOT IN의 존재 :

INSERT B 
SELECT A.* 
     LEFT JOIN B 
      ON A.Key1 = B.Key1 
      AND A.Key2 = B.Key2 
WHERE B.Key1 IS NULL