1

我正在尝试生成一个 SQL 查询,该查询可以将两个表连接在一起并返回结果..但第二个表是“扁平的”。我不确定这是否是正确的技术术语。它是非规范化的吗?

无论如何,有人可以建议我怎么做吗?

表:用户

UserId  Name
1       Pure.Krome
2       John
3       Jill
4       Jane

表:用户别名

UserAliasId  UserId  Alias
1            1       Idiot
2            1       PewPew
3            3       BlahBlahBlah

期望的结果

UserId  Name        Aliases
1       Pure.Krome  Idiot PewPew
2       John
3       Jill        BlahBlahBlah
4       Jane

请注意:

  • 用户不需要有别名。所以这是一个零->多关系(outer join
  • 第二张表的展平分隔符是空格。如果别名有空格,那我倒霉。(考虑一下,坏数据)。

我的问题的另一个例子是想到一个 StackOverflow 问题 + 标签。

4

3 回答 3

4

http://groupconcat.codeplex.com/有一个 MySQL 的克隆GROUP_CONCAT()实现为 CLR 聚合函数。我想 SQL 不是问题,但我也不妨:

SELECT 
  [Users].[UserId] AS UserId,
  [Users].[Name] AS Name,
  GROUP_CONCAT_D([UserAliases].[Alias]," ") AS Aliases
FROM [Users]
OUTER JOIN [UserAliases] ON [Users].[UserId]=[UserAliases].[UserId]

或类似的。

于 2012-05-24T05:14:54.907 回答
2

这未经测试,但试一试。我这里没有服务器。

SELECT  a.UserID, 
        a.[Name], 
        coalesce(NewTable.NameValues, '') Aliases
FROM    Users a LEFT JOIN
        (
          SELECT  UserID,
          STUFF((
            SELECT  '  ' + [Name] 
            FROM    UserAliases
            WHERE   ( UserID = Results.UserID )
            FOR XML PATH('')), 1, 2, '') AS NameValues
          FROM    UserAliases Results
          GROUP BY UserID
        ) NewTable
        on a.UserID = NewTable.UserID

这是 SQL Fiddle 输出

于 2012-05-24T05:25:55.717 回答
1

FOR XML PATH在这种情况下很方便:

SELECT UserID, Name 
    , LTRIM(RTRIM((SELECT ' ' + Alias 
        FROM UserAliases WHERE UserID = u.UserID 
        FOR XML PATH('')))) AS Aliases
FROM Users u
于 2012-05-24T05:29:01.217 回答