展平多行

时间:2014-02-04 11:07:15

标签: sql sql-server

我正在尝试将多行的结果合并为一个。我想展平下面的前两行,并且可能将关键字组合在一起,使它们在同一列中。我怎么能简单地使用select语句(即没有函数)呢?

我目前正在接受:

documentid documentname keyword
1          doc1         politics politics italy 
2          doc2         politics politics italy 

我想得到:

documentid documentname keyword
1          doc1         politics italy
2          doc2         politics

这是我的查询的一部分:

SELECT  d.DocumentId AS documentid ,
    m.Title AS documentname ,
    STUFF(( SELECT  N' ' + k.Word
        FROM    [arabicarchive].[dbo].[Keywords] k
            JOIN [arabicarchive].[dbo].DocumentKeywords dk ON k.KeywordId = dk.Keyword_KeywordId
            JOIN [arabicarchive].[dbo].Documents d ON dk.Document_DocumentId = d.DocumentId
        FOR
            XML PATH('')
        ), 1, 1, '') AS Keyword
FROM    [arabicarchive].[dbo].[Metadatas] m
    JOIN [arabicarchive].[dbo].[Documents] d ON d.DocumentId = m.DocumentId
WHERE   d.Status = 1

编辑:我已更新了查询以及我目前获得的结果。我之前没有使用过STUFF或XML PATH,所以请耐心等待。

编辑2:我设法摆脱了重复的行,但关键字列中的结果不正确。

编辑3:向查询添加DISTINCT仍然不会生成具有正确值的关键字列。

1 个答案:

答案 0 :(得分:1)

在我曾写过的一篇文章中,最后,我展示了如何做到这一点 Database Migration Scripts: Getting from place A to place B 如果你看起来接近结束,你会看到一些类似于你想要的代码。我已经修改过适合你想要的东西了。

    SELECT title_ID, title, ltrim(
    (SELECT distinct ' '+tagname.tag FROM titles thisTitle
      INNER JOIN TagTitle ON titles.title_ID=TagTitle.Title_ID
      INNER JOIN Tagname ON Tagname.TagName_ID=TagTitle.TagName_ID
    WHERE ThisTitle.title_id=titles.title_ID
    FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'))  
    FROM titles
    ORDER BY title_ID 

我认为这样的事情会起作用,但我无法测试它!...

    SELECT  d.DocumentId AS documentid ,  m.Title AS documentname ,
           ltrim(
              ( SELECT  distinct N' ' + k.Word
            FROM    [arabicarchive].[dbo].[Keywords] k
                JOIN [arabicarchive].[dbo].DocumentKeywords dk ON k.KeywordId = dk.Keyword_KeywordId
                Where  dk.Document_DocumentId=d.DocumentId
            FOR
                XML PATH(''), TYPE).value('.', 'nvarchar(max)')
            ) AS Keyword
    FROM    [arabicarchive].[dbo].[Metadatas] m
        JOIN [arabicarchive].[dbo].[Documents] d ON d.DocumentId = m.DocumentId
    WHERE   d.Status = 1
相关问题