Sql UNION NULLS进入可在以后查询的视图
Microsoft SQL SERVER: 我正在研究一个技能矩阵问题。下面的示例是一个简化的场景。一家公司有一个工厂,有两个职位:学徒(APP)和专家(EXP)。您可以在jobskills表中看到学徒必须能够切割、钻孔和弯曲(10、20、30)。专家应该能够在车床上切割、钻孔、弯曲、焊接和转动(10到50) 工作技能表:Sql UNION NULLS进入可在以后查询的视图,sql,sql-server,view,null,unions,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
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
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
同样,公司有三名员工,艾尔、汤姆和鲍勃,他们并不完全具备他们应该具备的所有技能。目标案例是专家Bob,他缺少关键弯曲技能(30),他本应作为学徒发展,但没有
就业技能表:
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
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
我试图将外部连接空值推送到具有匹配记录的视图中,以便查询技能数据的应用程序可以通过emp_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);
我得到了空(30)技能行的预期笛卡尔连接
联合联接结果:
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的技能(选择Emp_ID=426的位置)时,我不会得到需要查看的空(30)行。
(b) 你会注意到学徒汤姆也缺少弯曲技能(30)。那么空(30)行属于谁呢
甚至可以在联合中建立一个虚拟列来传播这些与上面所需结果中的emp_ID相关联的缺失的空值吗
蒂亚,
John您希望使用
JOIN
获得每个工作所需的技能,然后使用左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
为了推广explict
JOIN
sintaxis的使用,Aaron Bertrand写了一篇很好的文章。将表格和数据作为文本发布,谢谢@JuanCarlosOropeza。我把帖子改成了文字。哇,胡安·卡洛斯·奥罗佩扎真是太棒了。我在Bob(426)的结果集中看到了426exp30[null columns]
。但回想一下,汤姆也错过了30弯的技巧。结果中没有Tom(396){null columns}
行。有什么想法吗?再查一遍。但是在你的jobskills
数据中,我认为有一个错误,因为没有任何ID 40,50。我在演示中解决了这个问题。还要添加条件加入emp\u ID
booooyaah@Juan Carlos Oropeza-就是这样!!这个额外的雇员成功了。40,50只是一个输入错误,在我的表格中是正确的。万分感谢。不要编辑我的问题,添加评论。你犯了什么错误?您可能应该创建一个新问题并引用此问题