UNION NULLS 成View,以后可以查询

UNION NULLS into View that can be queried later

微软SQL服务器:

我正在研究技能矩阵问题。下面的示例是一个简化的场景。某公司有一个工厂,有两个职位:学徒(APP)和专家(EXP)。您可以在工作技能 table 中看到学徒必须能够切割、钻孔和弯曲 (10, 20, 30)。专家应该能够在车床上切割、钻孔、弯曲、焊接和车削(10 到 50)。

工作技能table:

job_code skill_desc skill_ID
-------- ---------- --------
APP      Cut              10
APP      Drill            20
APP      Bend             30
EXP      Cut              10
EXP      Drill            20
EXP      Bend             30
EXP      Weld             40
EXP      Turn             50

同样,公司有三名员工,Al、Tom 和 Bob,他们并不完全具备他们应该具备的所有技能。目标案例是缺少关键弯曲技能 (30) 的专家鲍勃,他本应作为学徒开发但没有。

员工技能table:

empl_ID emplName job_code skill_ID
------- -------- -------- --------
    307 Al       APP            10
    307 Al       APP            20
    307 Al       APP            30
    396 Tom      APP            10
    396 Tom      APP            20
    426 Bob      EXP            10
    426 Bob      EXP            20
    426 Bob      EXP            40
    426 Bob      EXP            50

我正在尝试将外部联接空值推送到具有匹配记录的视图中,以便查询技能数据的应用程序可以通过 empl_ID=426 查找 Bob 并查看他当前的技能和他缺少的技能技能。最终,我需要进入下面的结果视图:

期望的结果

empl_ID emplName job_code skill_ID
------- -------- -------- --------
    426 Bob      EXP            10
    426 Bob      EXP            20
    426 {null}   {null}         30
    426 Bob      EXP            40
    426 Bob      EXP            50

我试过这样的事情:

(select t1.empl_ID, t1.emplName, t2.job_code, t1.skill_ID 
 from emplskills t1, jobskills t2 
 where t1.skill_ID = t2.skill_ID AND t1.job_code = t2.job_code)
 UNION
(select t1.empl_ID, t1.emplName, t2.job_code, t2.skill_ID 
 from jobskills t2 left outer join emplskills t1 
 on t2.skill_ID = t1.skill_ID AND t2.job_code = t1.job_code 
 where t1.empl_ID is null);

我得到了 NULL (30) 技能行的预期笛卡尔连接。

UNION 连接结果:

empl_ID emplName job_code skill_ID
------- -------- -------- --------
 {null} {null}   EXP            30
    307 Al       APP            10
    307 Al       APP            20
    307 Al       APP            30
    396 Tom      APP            10
    396 Tom      APP            20
    426 Bob      EXP            10
    426 Bob      EXP            20
    426 Bob      EXP            40
    426 Bob      EXP            50

但是这里有两个问题: (a) 当我查询视图以查看 Bob 的技能时(select,其中 empl_ID=426),我不会获得我需要查看的 NULL (30) 行。 (b) 您会注意到 Apprentice-Tom 也缺少弯曲技能 (30)。那么NULL(30)行属于谁呢?

是否有可能在 UNION 中建立一个虚拟列来传播这些缺失的与 empl_ID 关联的 NULL,就像上面期望的结果一样?

TIA, 约翰

您想使用 JOIN 获得每项工作所需的技能,然后使用 LEFT JOIN 找出缺少的技能。

SQL DEMO

WITH required_skills as (
   SELECT DISTINCT e.empl_ID, e.job_code, j.skill_ID
   FROM emplskills e
   JOIN jobskills j
     ON e.job_code = j.job_code
)
SELECT *
FROM required_skills r
LEFT JOIN emplskills e
   ON r.empl_ID = e.empl_ID
  AND r.skill_ID = e.skill_ID