Объединение двух таблиц, в которых уникальный ключ содержит несколько столбцов

У меня есть две таблицы A и B (с одной и той же схемой), и я хочу объединить их, вставив все записи из A в B. Если в таблице B уже есть данные, связанные с ключом из A, я хочу молча удалить эти данные.

Проблема в том, что таблица B имеет уникальный ключевой индекс, состоящий из трех столбцов, поэтому я не могу просто сказать «WHERE A.key <> B.key».

Кажется, я не могу сформулировать оператор SQL в соответствии со строками:

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

Есть ли способ INSERT тех строк из A в B, где соответствующий трехстолбцовый ключ еще не существует в B?


person Philip    schedule 22.11.2012    source источник
comment
пожалуйста, дайте мне знать столбцы этих двух таблиц   -  person Chella    schedule 22.11.2012
comment
@Chella: вам нужны имена или соответствующие типы?   -  person Philip    schedule 22.11.2012


Ответы (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 таблицы с левым соединением и вставьте все из A, где B равно null (нет соответствующего значения в таблице B для соединения в 3 ключевых столбцах)

person Richard Vivian    schedule 22.11.2012

Вы можете использовать NOT EXISTS вместо NOT IN

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

Хотя согласно этому MySQL оптимизирует LEFT JOIN/IS NULL лучше, чем не существует:

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