SQL 服务器 (2008) 复合 INSERT INTO... WHERE NOT EXISTS with a 3rd table
SQL Server (2008) Compound INSERT INTO... WHERE NOT EXISTS with a 3rd table
我有一个工厂工人的技能管理数据库,其中包含如下数据:
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 table 包含属于每个职位的技能。例如:工作 ID 220 是机械师 I 级(定义的技能低于 II 级)。工作 ID 221 是二级机械师(定义的技能比一级更多)。
这是工作技能 table:
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 SKILLStable,维护每个员工badge_ID和他们目前精通的技能。Robert Murphy(badge_ID = 792)目前是Mechanic Level I. 他精通 Mechanic Level I 技能集中应具备的所有技能。这是罗伯特在 empl_skills table:
中的当前信息
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);
第三,Robert的职称存储在employee master中table:
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 table 并将起始熟练度设置为 0。但我不想打扰当前技能以及已经存在的熟练程度记录。作为他晋升的一部分,我只想添加技能 65 和技能 71 - 这是他作为二级机械师必须保持的两项新的附加技能。是否有可能在一个 SQL 语句中以某种方式将这三个 table 关联在一起?
此外,在升级周期中,当我准备好 运行 我的 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 再次感谢您的大力帮助,
约翰
通过获取适用于该工作的所有技能并剔除员工已经拥有的技能(es.skill_ID IS NULL),您可以获得所缺少的一切。你可以做一个 WHERE NOT EXISTS 或 WHERE NOT IN,但我更喜欢这个。
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
我有一个工厂工人的技能管理数据库,其中包含如下数据:
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 table 包含属于每个职位的技能。例如:工作 ID 220 是机械师 I 级(定义的技能低于 II 级)。工作 ID 221 是二级机械师(定义的技能比一级更多)。
这是工作技能 table:
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 SKILLStable,维护每个员工badge_ID和他们目前精通的技能。Robert Murphy(badge_ID = 792)目前是Mechanic Level I. 他精通 Mechanic Level I 技能集中应具备的所有技能。这是罗伯特在 empl_skills table:
中的当前信息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);
第三,Robert的职称存储在employee master中table:
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 table 并将起始熟练度设置为 0。但我不想打扰当前技能以及已经存在的熟练程度记录。作为他晋升的一部分,我只想添加技能 65 和技能 71 - 这是他作为二级机械师必须保持的两项新的附加技能。是否有可能在一个 SQL 语句中以某种方式将这三个 table 关联在一起?
此外,在升级周期中,当我准备好 运行 我的 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 再次感谢您的大力帮助, 约翰
通过获取适用于该工作的所有技能并剔除员工已经拥有的技能(es.skill_ID IS NULL),您可以获得所缺少的一切。你可以做一个 WHERE NOT EXISTS 或 WHERE NOT IN,但我更喜欢这个。
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