帮助编写SQL查询以加入表自身

时间:2010-12-17 17:59:56

标签: sql sql-server-2005 join

我有一个返回如下表的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

有谁知道是否有可能像我期待的那样进行联接?我最新的想法是它需要不止一个选择,但我还没有想到它

3 个答案:

答案 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)对其进行近似,其他受访者已经链接了展示这些技术的文章。