sql-server - SQL Server (2008) 复合 INSERT INTO...WHERE NOT EXISTS 与第三个表

标签 sql-server insert-into

我有一个工厂 worker 的技能管理数据库,其中包含如下数据:

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 表保存属于每个职位的技能。例如:职位 ID 220 是 I 级机械师(定义的技能少于 II 级)。职位 ID 221 是 II 级机械师(定义为比 I 级更多的技能)。

这是工作技能表:

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 和他们当前精通的技能。Robert Murphy (badge_ID = 792) 目前是 I 级机械师。他精通所有他应该掌握的技能拥有机械师一级技能。以下是 empl_skills 表中 Robert 的当前信息:

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 的职位名称存储在员工主表中:

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 - 这是他作为 II 级机械师必须保持的两项新的附加技能。是否可以在一个 SQL 语句中以某种方式将这三个表关联在一起?

此外,在升级周期中,当我准备好运行 INSERT 语句时,Robert 的 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

关于sql-server - SQL Server (2008) 复合 INSERT INTO...WHERE NOT EXISTS 与第三个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52951013/

相关文章:

ASP.NET SQL Server 选择前 N 个值但跳过 M 个结果

sql - 选择 SQL Server 数据库大小

sql-server - SQL Compact Edition 的类似 Access 的编辑器

PHP 将值插入两个表并将这些表中的键插入链接表

mysql - 插入子查询条件

sql-server - SQL Server 导入向导不支持从超过 255 列的 Excel 工作表导入

sql-server - 为什么正则表达式在使用 like 的 sql server select 语句中不起作用

php - MYSQL 插入 : You have an error in your SQL syntax

sql - 对同一表的列强制执行外键约束