Объединение двух таблиц, в которых уникальный ключ состоит из нескольких столбцов
У меня есть две таблицы 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