在列中选择相同的值一次,在其他列中选择拥有的值

时间:2014-02-27 22:11:38

标签: sql sql-server database

我知道头衔最初没有意义。让我解释一下。

得到3个表:冷藏箱,纪律和判断

在冷藏表中我有ID,姓名和姓氏。

---------------
1  John   Doe
2  john2  Doe2
3  etc

在Discipline表中,我获得了Discipline名称和id

------------
1   hockey
2   Basketball
3   football
4   etc

在JudgedBy表中,我从纪律和冷藏表中获得了外键。有冷藏ID和纪律ID。在一个运动学科中,可以有多个冷藏箱

---------------
1  4  //Discipline with id 1 is judged by reefer with id 4,2,3 
1  2
1  3

我想要的是,在一列中选择纪律(名称),在其他列中选择冷藏,这样纪律只显示一次,所有冷藏在行中显示为字符串。像这样的东西

---------
|hockey|      |John Doe , John2 Doe2, etc| 
|Basketball|  |Another reefer, Jet another reefer|

到目前为止,我已经完成了这项任务的两个部分,但我不能把它们放在一起。

为了选择学科和冷藏箱我使用内部联接

SELECT  Discipline.Name, Reefers.name, Reefers.surname
FROM  Discipline INNER JOIN
      JudgedBy ON JudgedBy.Discipline_ID = Discipline.ID INNER JOIN
      Reefers ON JudgedBy.Reefer_ID = Reefers.ID

我得到了

------------
hockey   John Doe
hockey   John2 Doe2
hockey   Another one

其他部分是将它们放在一个字符串中。发现这件作品

declare @out as varchar(max)
set @out= ''
select @out = @out + Name + ' ' + Surnam + ', ' from Reefers
select @out as Game reefers 

我如何把这两件作品放在一起?我希望我解释一下我想要实现的目标。

谢谢!

1 个答案:

答案 0 :(得分:0)

在SQL Server中进行聚合字符串连接有点痛苦。它需要子查询和for xml path()

以下是您要执行的操作的示例:

select d.name,
       stuff((select ', '+r.name + ' ' + r.surname
              from JudgedBy jb join
                   Reefers r
                   on jb.Reefer_ID = r.ID
              where jb.Discipline_ID = d.ID
              for xml path ('')
             ), 1, 2, '')
from Discipline d;