UNION NULL进入View,以后可以查询

时间:2018-07-09 15:38:09

标签: sql sql-server view null unions

Microsoft SQL SERVER:

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

工作技能表:

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

emplskills表:

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

我正在尝试将外部联接null推入具有匹配记录的视图中,以便查询技能数据的应用程序可以通过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的技能(在empl_ID = 426处选择)时,我不会得到需要查看的NULL(30)行。 (b)您会注意到,徒弟汤姆(Tom)也缺少弯曲技巧(30)。那么NULL(30)行属于谁?

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

TIA, 约翰

1 个答案:

答案 0 :(得分:0)

您想使用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
相关问题