【问题标题】:UNION NULLS into View that can be queried laterUNION NULLS 到可以稍后查询的视图中
【发布时间】: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, 约翰

【问题讨论】:

标签: sql sql-server view null unions


【解决方案1】:

您想使用JOIN 获得每项工作所需的技能,然后使用LEFT JOIN 找出缺少的技能。

SQL DEMO

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

【讨论】:

  • 哇,太棒了@Juan Carlos Oropeza。我在 Bob (426) 的结果集中看到了 426 EXP 30 [null columns]。但请记住,Tom 也缺少 30 Bend 技能。结果中没有Tom (396) {null columns} 行。有什么想法吗?
  • 再次检查。但是在您的jobskills 数据中,我认为存在错误,因为没有任何 ID 40,50。我在演示中解决了这个问题。同时添加条件加入empl_ID
  • BOOOOYaaah @Juan Carlos Oropeza - 就是这样!额外的 empl_ID 起到了作用。 40,50 只是一个错字,在我的表格中是正确的。谢谢百万人。
  • 不要编辑我的问题,添加评论。你有什么错误?您可能应该创建一个新问题并参考此问题
猜你喜欢
  • 2018-12-19
  • 2012-02-20
  • 1970-01-01
  • 2011-09-05
  • 2018-10-14
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
相关资源
最近更新 更多