Попытка вставить значения из одной таблицы в другую, где совпадение суррогатного ключа не найдено

Я пытаюсь смоделировать полное внешнее объединение, сравнивая две таблицы друг с другом. Таблица batch_import содержит записи, которые необходимо вставить, только если их нет в таблице сотрудников. Для этого я попробовал следующий запрос:

INSERT INTO employees (forename, surname, employersId, custom_corpore_headOffice, contractId)
SELECT firstname, surname, employeenumber, dob, store, contractId
FROM batch_import
LEFT JOIN employees ON batch_import.employeenumber = employees.employersId AND batch_import.contractId = employees.contractId
UNION ALL
SELECT forename, surname, employersId, custom_corpore_headOffice, contractId
FROM batch_import RIGHT JOIN employees ON batch_import.employeenumber = employees.employersId AND batch_import.contractId = employees.contractId
WHERE batch_import.employeenumber IS NULL AND batch_import.contractId IS NULL
                       ";

однако, когда я запускаю этот запрос, я получаю сообщение от mysql: ОШИБКА 1137 (HY000): Не могу открыть таблицу: 'batch_import'

Я предполагаю, что логика моего СОЮЗА ВСЕ неверна. Может ли кто-нибудь помочь мне найти решение?

РЕДАКТИРОВАТЬ:: Я пробовал этот запрос, и он продолжает добавлять записи в таблицу, начиная с последней записи. Я также попробовал:

                    INSERT INTO employees (forename, surname, employersId, dateOfBirth, custom_corpore_headOffice, contractId)
                SELECT firstname, batch_import.surname, employeenumber, dob, store, batch_import.contractId
                FROM batch_import
                LEFT JOIN employees ON batch_import.employeenumber = employees.employersId AND batch_import.contractId = employees.contractId
                UNION
                SELECT firstname, batch_import.surname, employeenumber, dob, store, batch_import.contractId
                FROM batch_import RIGHT JOIN employees ON batch_import.employeenumber = employees.employersId AND batch_import.contractId = employees.contractId;

но все равно безрезультатно. Вместо того, чтобы игнорировать то, что существует, он просто записывает все в конец таблицы.

Также попробовал: INSERT INTO employees (forename, surname, employersId, dateOfBirth, custom_corpore_headOffice, contractId) SELECT firstname, batch_import.surname, employeenumber, dob, store, batch_import.contractId FROM batch_import LEFT JOIN employees ON employees.employersId = NULL;

1 ответ

Решение

ОПЦИЯ 1

INSERT INTO employees (forename, surname, employersId, custom_corpore_headOffice, contractId)
SELECT firstname, surname, employeenumber, dob, store, contractId
FROM batch_import
WHERE NOT EXISTS (Select 1 From employees where batch_import.employeenumber = employees.employersId AND batch_import.contractId = employees.contractId)

ВАРИАНТ 2

INSERT INTO employees (forename, surname, employersId, custom_corpore_headOffice, contractId)
SELECT firstname, surname, employeenumber, dob, store, contractId
FROM batch_import
LEFT JOIN employees ON batch_import.employeenumber = employees.employersId AND batch_import.contractId = employees.contractId
WHERE employees.employersId is NULL
Другие вопросы по тегам