【问题标题】:help writing a SQL query to join a table on itself帮助编写一个 SQL 查询来连接一个表
【发布时间】:2010-12-17 17:59:56
【问题描述】:

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

有谁知道是否可以像我想要的那样进行加入?我最近的想法是它需要不止一个选择,但我还没有完全弄清楚

【问题讨论】:

标签: sql sql-server-2005 join


【解决方案1】:

也许你可以通过group_concat提出解决方案

在相等的列上进行分组,使员工的身份和 group_concat 在您想要连接的其他人上。

【讨论】:

  • 我能够得到某种与此相关的工作。它适用于一列,但我不能让它同时适用于第二列。 +1 指出正确的方向
【解决方案2】:

根据您的数据,这对于自联接是不可能的,因为您的行没有唯一键。要使自联接成为一种选择,您必须防止一行与自身联接。因此,您上面的查询实际上会返回 2 行的 id 147。

解决此问题的一种简单方法是查询从 temptable 中选择不同的 id 和名称,然后使用 4 个函数返回一个连接字符串,其中包含所有出现的年份、劳动等级、职称和技能ID。

【讨论】:

    【解决方案3】:

    这不是自加入任务,因为您必须为每个可能的技能一次加入表。如果事先知道员工可能具备的最大技能数量并且相当小,那么您可能会开始通过自我加入来接近它,但这不太可能是真的。 (另一方面,如果确实保证技能的数量只有 Java 和 Javascript 而没有其他,您可以使用自联接甚至更简单的 MIN/MAX GROUP BY 来做到这一点。

    这实际上是一个通过 GROUP BY 查询来解决的聚合问题。不幸的是,SQL Server 没有内置的字符串连接聚合函数(MySQL 和其他一些产品也是如此)。您可以通过几种不同的方式(CTE 或 For XML)来近似它,其他受访者已经链接了展示这些技术的文章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      相关资源
      最近更新 更多