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

У меня есть две таблицы 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?

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 равно нулю (нет соответствующего значения в таблице B для объединения в столбцах 3 Key)

Вы могли бы использовать 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
Другие вопросы по тегам