SQL Server (2008) Compound INSERT into..不存在的地方与第三个表



我有一个工厂工人的技能管理数据库,其中包含这样的数据:

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

"工作技能"表包含属于每个职位的技能。例如:作业 ID 220 是机械师级别 I(定义为技能低于级别 II(。职位 ID 221 是二级机械师(定义为比一级更多的技能(。

这是工作技能表:

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);

然后有一个员工技能表,用于维护每个员工的badge_ID和他们目前精通的技能。罗伯特·墨菲(badge_ID = 792(目前是一级机械师。他精通机械师一级技能组合中应该具备的所有技能。以下是罗伯特在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。我想将他在一级和二级之间缺少的新技能添加到empl_skills表中,并将起始熟练度设置为 0。但我不想打扰已经存在的当前技能和熟练程度记录。作为晋升的一部分,我只想增加技能65和技能71 - 这是他作为二级机械师必须保持的两个新技能。是否可以进行插入...不存在的地方以某种方式将这三个表关联在一个 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再次感谢您的出色帮助, John

通过获得适用于工作的所有技能并消除员工已经拥有的技能(es.skill_ID为空(,您可以获得缺少的一切。你可以做一个不存在的地方或不存在的地方,但我更喜欢这个。

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

最新更新