1

2つのテーブルを結合して結果を返すことができるSQLクエリを生成しようとしていますが、2番目のテーブルは「フラット化」されています。それが正しい専門用語かどうかはわかりません。非正規化されていますか?

とにかく、誰かが私がこれを行う方法を提案できますか?

表:ユーザー

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

表:UserAliases

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
  • 2番目のテーブルを平坦化するための区切り文字はSPACEです。エイリアスにスペースがある場合は、運が悪いです。(考えてみてください、悪いデータ)。

私の問題の別の例は、StackOverflowの質問とタグについて考えることです。

4

3 に答える 3

4

http://groupconcat.codeplex.com/GROUP_CONCAT()には、CLR 集計関数として実装されたMySQL のクローンがあります。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フィドル出力があります

于 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 に答える