SQL Server (2008) Составной INSERT INTO ... ГДЕ НЕ СУЩЕСТВУЕТ с 3-ей таблицей - PullRequest
0 голосов
/ 23 октября 2018

У меня есть база данных управления навыками для фабричных рабочих, которая имеет такие данные:

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 Ответ

0 голосов
/ 23 октября 2018

Получив все навыки, применимые к работе, и отменив те, которые уже есть у сотрудника (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
...