在联盟视图中需要唯一列

时间:2018-06-21 14:01:48

标签: sql sql-server null union uniqueidentifier

我有一个培训应用程序,其中我需要两个表的联合作为SQL Server中的视图。我的公司有一个编码技能列表。钻孔是代码10,打磨是代码30,依此类推。在我们工厂中,根据这些技能代码对员工进行了衡量。 为了说明,让我们选择“鲍勃”。鲍勃(Bob)是金属修整师,在EmplSkills表中维护多项技能。

View EmplSkills

第二,在JobSkills表中是“ Metal Finisher”的技能要求。

View JobSkills

通过比较两个表格,您可以看到Bob的技能与他作为Metal Finisher的职位要求不完全匹配...但是它们非常接近。

但是,从AS9100质量审核的角度来看,我需要确切知道其接近程度。我需要与工作需求UNION匹配的所有Bob技能,以及所有不在工作范围内但很擅长UNION的Bob 额外 技能。和Bob的所有 missing 技能一起学习,这些技能对于立即接受培训非常重要。

因此,我正在使用下面的SQL代码在两个表上创建联合视图, here is the union-join result 您可以看到Bob可以对金属进行去毛刺和去毛刺处理……很好,但是Bob在工作岗位上没有打磨或刮削的技能,这很糟糕。

(SELECT a bunch of columns..., , row_number() over (order by t1.ref_no) as RowNum
   FROM emplskills as t1 
   LEFT OUTER JOIN jobskills as t2 on t1.skill_ID = t2.skill_ID 
  WHERE t2.skill_ID is null)
UNION
(SELECT the same bunch of columns..., , row_number() over (order by t1.ref_no) as RowNum
   FROM jobskills as t2 
   LEFT OUTER JOIN emplskills as t1 on t2.skill_ID = t1.skill_ID 
  WHERE t1.skill_ID is null)
 UNION
(SELECT the same bunch of columns..., , row_number() over (order by t1.ref_no) as RowNum
   FROM emplskills as t1, jobskills AS t2 
  WHERE t1.skill_ID=t2.skill_ID);

我正在使用一种应用程序环境(Catavolt),其中所有数据表都需要至少一个唯一的数据列,该列被远程用作其自身内部管理的虚拟“主键”。因此,我需要发明一列唯一值,但我不知道该怎么做。我尝试过row_number()(按...排序)。我尝试了每个源表中的两个唯一的ref_no列

SELECT ... , ((t1.ref_no*100000)+t2.ref_no) as UniqueKey

但是结果中的NULL破坏了数学,我失去了唯一性。

还有其他可以添加的内容吗?只要值是唯一的,这些值的来源,含义或大小无关紧要。

TIA, 约翰

编辑:从Tab的row_number()上方的RowNum建议(按t1.ref_no排序)

enter image description here

1 个答案:

答案 0 :(得分:1)

由于听起来确实确实需要在现有结果中添加一个任意的唯一列,因此很简单:

SELECT *, ROW_NUMBER() OVER (ORDER BY {any column, really, it doesn't matter}) rn
FROM (
  {Your existing query}
) t