我有一个返回如下表的SQL查询:
id emp_name total_explabor_grade title name
518 Name,One 3 PE4 Software Engineer Java
492 Name,Two 4 PE1 Software Engineer Java
502 Name,Three 1 SPE5 Principal Javascript
410 Name,Four 3 ENG3 Software Engineer Java
147 Name,Five 5 SPE5 Director Java
147 Name,Five 2 SPE5 Director Javascript
156 Name,Six 10 PE2 Senior Java
156 Name,Six 8 PE2 Senior Javascript
这是基于对具有Java或Javascript技能的人的查询。正如您所看到的,员工147和156对Java和Javascript都有所了解。
如果我将当前查询存储到临时表中,请说#TempTable
我可以在#TempTable上运行什么查询来给我一个这样的结果:
id emp_name total_explabor_grade title name
518 Name,One 3 PE4 Software Engineer Java
492 Name,Two 4 PE1 Software Engineer Java
502 Name,Three 1 SPE5 Principal Javascript
410 Name,Four 3 ENG3 Software Engineer Java
147 Name,Five 5,2 SPE5 Director Java,Javascript
156 Name,Six 10,8 PE2 Senior Java,JavaScript
我曾尝试以各种形式加入#TempTable,但是我还没有能够让它给我一张像我刚发布的那样的表格。 这是我到目前为止编写的代码......
select t1.id, t1.emp_name, CONVERT(nvarchar(3),t1.total_exp)+','+CONVERT(nvarchar(3),t2.total_exp), t1.labor_grade, t1.title, t1.name+','+t2.name AS hits
from #TempTable t1 JOIN #TempTable t2
ON t1.id=t2.id
有谁知道是否有可能像我期待的那样进行联接?我最新的想法是它需要不止一个选择,但我还没有想到它
答案 0 :(得分:2)
也许您可以通过group_concat
在相同的列上创建员工身份,将group_concat
添加到其他您想要连接的人身上。
答案 1 :(得分:0)
基于您的数据,自连接无法实现这一点,因为您的行没有唯一键。要使自联接成为一个选项,您必须防止一行与自身连接。因此,上面的查询实际上会为id 147返回2行。
一个简单的方法是从temptable中选择不同的id和名称,然后使用4个函数返回所有出现的年份,人工等级,职称和技能的连接字符串。 ID。
答案 2 :(得分:0)
这不是自我加入任务,因为您必须为每种可能的技能一次加入表格。如果提前知道员工可能掌握的最大技能数量且相当小,您可能会开始接受自我加入,但这不可能是真的。 (另一方面,如果技能的数量确实只保证为Java和Javascript,那么你可以通过自连接甚至更简单的MIN / MAX GROUP BY来实现。)
这实际上是使用GROUP BY查询解决的聚合问题。不幸的是,SQL Server没有内置的字符串连接聚合函数(MySQL和其他一些产品也是如此)。您可以通过几种不同的方式(CTE或For XML)对其进行近似,其他受访者已经链接了展示这些技术的文章。