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, 约翰
答案 0 :(得分:0)
您想使用JOIN
来获得每项工作所需的技能,然后使用LEFT JOIN
来找出缺少的一项。
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