sql,将子查询数据放入表中

时间:2013-12-02 19:07:30

标签: sql sql-server join

抱歉这个糟糕的头衔。不知道如何形容这一点。

我有一张表users,其中包含:

 userID |   firstname  | lastname

然后我有一个名为userColors的第二个表,它记录每个用户最喜欢的颜色:每个用户可以有一种颜色,或许多颜色:

 id | userID | colorID

然后是colors表:

 colorID | colorName

我目前导出一长串用户,每种颜色都有自己的行。所以有些用户会有一行,有些会有多行。

我现在想要尝试的是,将每个用户放在一行上,最后一列中最喜欢的颜色列表(每个都在自己的行中 - 或 - 在同一列中,只用逗号分隔)。如:

userID | firstname | lastName  | colors
------------------------------------------------
  2    |  harry    | smith     | red
  3    |  larry    | whatever  | blue, yellow

OR:

userID | firstname | lastName  | color1  | color2  | color_as_many_as_needed....
----------------------------------------------------------------------------------
  2    |  harry    | smith     | red
  3    |  larry    | whatever  | blue    |  yellow

我猜答案是一个子查询,但不知道如何加入它......

2 个答案:

答案 0 :(得分:2)

以下SQL Fiddle演示了以下查询:

SELECT u.*, 
colors = STUFF((
          SELECT ', ' + c.colorName
          FROM userColors AS uc
          INNER JOIN colors AS c ON uc.colorID = c.colorID
          WHERE u.userID = uc.UserID
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM users AS u

答案 1 :(得分:0)

这应该给你一个提示:

select 'test' as Test, 1 as Item 
into #test 
union select 'test2', 2 
union select 'test', 3 
union select 'test', 5 

select t2.test, STUFF((SELECT  ', ' + cast(t1.Item as varchar (10) )
        FROM #test t1 where t2.test = t1.test 
        FOR XML PATH('')), 1, 1, '') 
     from #test t2
     group by t2.test