У меня есть база управления навыками для рабочих фабрик, у которых есть такие данные:
skill 46: Thread work tap & die
skill 49: Welding proficiency
skill 51: CMM operator
skill 52: Lathe operator
skill 65: Fork Lift operator
skill 71: Portable crane operator
В таблице JOB SKILLS хранятся навыки, относящиеся к каждому названию задания. Например: Идентификатор задания 220 - это уровень механики I (определенный с меньшими навыками, чем уровень II). Идентификатор работы 221 - это уровень механики II (определяется с большим количеством навыков, чем уровень I).
Вот таблица JOB SKILLS:
create table job_skills (job_ID int, skill_ID int, proficiency_level int);
insert job_skills (220, 46, 2);
insert job_skills (220, 49, 2);
insert job_skills (220, 51, 2);
insert job_skills (220, 52, 2);
insert job_skills (221, 46, 3);
insert job_skills (221, 49, 3);
insert job_skills (221, 51, 3);
insert job_skills (221, 52, 3);
insert job_skills (221, 65, 2);
insert job_skills (221, 71, 2);
Затем есть таблица EMPLOYEE SKILLS, которая поддерживает каждого сотрудника badge_ID и навыки, которыми они в настоящее время владеют. Роберт Мерфи (badge_ID = 792) в настоящее время является механическим уровнем I. Он обладает всеми навыками, которые он должен иметь в Механический уровень I навыков. Вот текущая информация Роберта в таблице empl_skills:
create table empl_skills (badge_ID int, skill_ID int, proficiency_level int);
insert empl_skills (792, 46, 3);
insert empl_skills (792, 49, 2);
insert empl_skills (792, 51, 2);
insert empl_skills (792, 52, 3);
В-третьих, название должности для Роберта хранится в главной таблице сотрудника:
create table empl_master (badge_ID int, firstname varchar(20), lastname varchar(20), job_ID int);
insert empl_master (792, 'ROBERT', 'MURPHY', 220);
Теперь, наконец, вопрос: Роберт Мерфи получает поощрение от Механика I до Механика II. Я хотел бы добавить его новые навыки, которые он пропускает между Уровнем I и Уровнем II, в таблицу empl_skills и установить начальный уровень владения в 0. Но я не хочу нарушать текущие навыки и уровни уровня владения, которые уже существуют. В рамках его продвижения я хочу только добавить умение 65 и умение 71 - это два новых дополнительных навыка, которые он должен будет поддерживать как уровень механика II. Возможно ли сделать что-то вроде INSERT INTO ... WHERE NOT EXISTS каким-то образом связать эти три таблицы вместе в одном выражении SQL?
Кроме того, в цикле продвижения, к тому времени, когда я готов запустить свое заявление INSERT, запись empl_master Роберта будет уже обновлена, установив job_ID с 220 на 221.
UPDATE empl_master set job_ID=221 WHERE badge_ID=792;
Результаты empl_skills должны выглядеть так:
badge_ID skill_ID proficiency_level
-------- -------- -----------------
792 46 3
792 49 2
792 51 2
792 52 3
792 65 0 <-- new rows difference between
792 71 0 <-- job titles 220 and 221
TIA снова за вашу потрясающую помощь, Джон
Всего 1 ответ
Получив все навыки, применимые к задаче, и устранив их, у которых уже есть (es.skill_ID IS NULL), вы можете получить все, что отсутствует. Вы можете делать ГДЕ НЕ СУЩЕСТВУЕТ ИЛИ ГДЕ НЕ ВХОД, но я предпочитаю это.
INSERT INTO empl_skills (badge_ID, skill_ID, proficiency_level)
SELECT
em.badge_ID,js.skill_ID,0
FROM job_skills js
INNER JOIN empl_master em ON em.job_ID=js.job_ID
LEFT JOIN empl_skills es ON es.skill_ID=js.skill_ID
es.badge_ID=em.badge_ID
WHERE es.skill_ID IS NULL
AND em.badge_ID=792