Sql UNION NULLS进入可在以后查询的视图

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

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
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只是一个输入错误,在我的表格中是正确的。万分感谢。不要编辑我的问题,添加评论。你犯了什么错误?您可能应该创建一个新问题并引用此问题