sql,将子查询数据获取到表中

sql,将子查询数据获取到表中,sql,sql-server,join,Sql,Sql Server,Join,对不起,标题不好。我不知道该如何描述这一点 我有一个表users,它有: userID | firstname | lastname 然后我有第二个表,名为userColors,它记录了每个用户最喜欢的颜色:每个用户可以有一种颜色,也可以有多种颜色: id | userID | colorID 然后是颜色表: colorID | colorName 我目前导出了一长串用户,每种颜色都有自己的行。因此,有些用户将有一行,有些用户将有多行 我现在想尝试的是,让每个用户在一行中,在最

对不起,标题不好。我不知道该如何描述这一点

我有一个表
users
,它有:

 userID |   firstname  | lastname
然后我有第二个表,名为
userColors
,它记录了每个用户最喜欢的颜色:每个用户可以有一种颜色,也可以有多种颜色:

 id | userID | colorID
然后是
颜色
表:

 colorID | colorName
我目前导出了一长串用户,每种颜色都有自己的行。因此,有些用户将有一行,有些用户将有多行

我现在想尝试的是,让每个用户在一行中,在最后的列中列出最喜欢的颜色(每个用户在自己的行中,或者在同一列中,只是逗号分隔)。例如:

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


我猜答案是一个子查询,但不确定如何加入它……

这应该给你一个提示:

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
下面是演示以下查询的示例:

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

实际上,答案是pivot查询。谷歌“SQLServerPivotQuery”,你会发现一些例子。如果你想在查询中这样做,这是可能的。如果您想从相关数据更改为具有这种可怕结构的表,那么不要这样做。
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