SQL Server (2008) Соединение INSERT INTO ... ГДЕ НЕ СУЩЕСТВУЕТСЯ с 3-й таблицей

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

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

Есть идеи?

10000