【发布时间】:2018-07-09 15:38:08
【问题描述】:
微软 SQL 服务器:
我正在研究技能矩阵问题。下面的示例是一个简化的场景。一家公司有一家工厂,有两个职称:学徒(APP)和专家(EXP)。您可以在工作技能表中看到学徒必须能够切割、钻孔和弯曲 (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
同样,该公司有 3 名员工,Al、Tom 和 Bob,他们并不完全具备应有的所有技能。目标案例是专家 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
我正在尝试将外部连接空值推送到具有匹配记录的视图中,以便查询技能数据的应用程序可以通过 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 的技能时(选择 where empl_ID=426),我不会得到我需要查看的 NULL (30) 行。 (b) 你会注意到学徒汤姆也缺少弯曲技能 (30)。那么NULL(30)行属于谁呢?
是否甚至可以在 UNION 中建立一个虚拟列来传播这些与 empl_ID 关联的缺失 NULL,就像上面所需的结果一样?
TIA, 约翰
【问题讨论】:
-
推广使用显式
JOINsintaxis,Aaron Bertrand 写了一篇很好的文章Bad habits to kick : using old-style JOINs 关于它。 -
以文本形式发布表格和数据READ THIS
-
感谢@JuanCarlosOropeza。我把帖子改成文字了。
标签: sql sql-server view null unions