UNION NULLS 成View,以后可以查询
UNION NULLS into View that can be queried later
微软SQL服务器:
我正在研究技能矩阵问题。下面的示例是一个简化的场景。某公司有一个工厂,有两个职位:学徒(APP)和专家(EXP)。您可以在工作技能 table 中看到学徒必须能够切割、钻孔和弯曲 (10, 20, 30)。专家应该能够在车床上切割、钻孔、弯曲、焊接和车削(10 到 50)。
工作技能table:
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) 的专家鲍勃,他本应作为学徒开发但没有。
员工技能table:
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 的技能时(select,其中 empl_ID=426),我不会获得我需要查看的 NULL (30) 行。
(b) 您会注意到 Apprentice-Tom 也缺少弯曲技能 (30)。那么NULL(30)行属于谁呢?
是否有可能在 UNION 中建立一个虚拟列来传播这些缺失的与 empl_ID 关联的 NULL,就像上面期望的结果一样?
TIA,
约翰
您想使用 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
微软SQL服务器:
我正在研究技能矩阵问题。下面的示例是一个简化的场景。某公司有一个工厂,有两个职位:学徒(APP)和专家(EXP)。您可以在工作技能 table 中看到学徒必须能够切割、钻孔和弯曲 (10, 20, 30)。专家应该能够在车床上切割、钻孔、弯曲、焊接和车削(10 到 50)。
工作技能table:
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) 的专家鲍勃,他本应作为学徒开发但没有。
员工技能table:
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 的技能时(select,其中 empl_ID=426),我不会获得我需要查看的 NULL (30) 行。 (b) 您会注意到 Apprentice-Tom 也缺少弯曲技能 (30)。那么NULL(30)行属于谁呢?
是否有可能在 UNION 中建立一个虚拟列来传播这些缺失的与 empl_ID 关联的 NULL,就像上面期望的结果一样?
TIA, 约翰
您想使用 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