【问题标题】:Need unique column in Union View需要联合视图中的唯一列
【发布时间】: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


【解决方案1】:

因为听起来您确实只需要在现有结果中添加任意唯一列,所以很简单:

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

【讨论】:

  • 这很可能是他们需要的。对于 order by,您甚至可以使用查询来执行 order by (select 1) 之类的操作。
  • 当!就是这样,先生们,谢谢!外部 row_number (@TabAlleman) 加上 select 1 (@SeanLange) 做到了。 SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as RowNum FROM (my giant union) as T;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多