【发布时间】:2018-06-21 14:01:48
【问题描述】:
我有一个培训应用程序,其中我需要两个表的联合作为 SQL Server 中的视图。我的公司有一份已编码的技能列表。钻孔是代码 10,打磨是代码 30,以此类推。在我们的工厂里,员工是根据这些技能代码来衡量的。 为了说明,让我们选择“Bob”。 Bob 是一名 Metal Finisher,他在 EmplSkills 表中保持了多项技能。
其次,在 JobSkills 表中是“Metal Finisher”的技能要求。
通过比较这两张表,您可以看到 Bob 的技能并不完全符合他作为 Metal Finisher 职位的要求......但它们非常接近。
但是,从 AS9100 质量审核的角度来看,我需要知道到底有多接近。我需要 Bob 的所有符合工作要求的技能与 Bob 的所有 额外 技能联合,这些技能不在工作范围内但很适合 UNION'学习了 Bob 缺少的所有技能,这些技能对于立即接受培训非常重要。
所以,我正在使用下面的 SQL 代码在两个表上创建联合视图,并且 你可以看到 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 () over (order by)。我尝试了每个源表中的两个唯一 ref_no 列
SELECT ... , ((t1.ref_no*100000)+t2.ref_no) as UniqueKey
但是结果中的 NULL 破坏了数学运算,我失去了唯一性。
还有什么我可以添加的吗?只要它们是独一无二的,它们的价值来自哪里、它们的含义或它们有多大都无关紧要。
TIA, 约翰
编辑:RowNum 建议来自 Tab on row_number() over (order by t1.ref_no)
【问题讨论】:
-
我不清楚您希望最终结果集是什么样子。如果您真的只需要在现有结果中添加一个虚构的唯一列,则可以使用 row_number()。
-
感谢@TabAlleman,但 row_number() 超过(什么?)。也许这就是我没有正确使用的。能给我一些代码吗?
-
这是一个很好的起点。 spaghettidba.com/2015/04/24/…
-
根据您的示例输出,我将 row_number() over (order by ref_no)
-
不确定那不是独一无二的。 ROW_NUMBER 为每一行返回一个新值,它们都是唯一的,除非您包括分区。
标签: sql sql-server null union uniqueidentifier