我正在尝试将多行的结果合并为一个。我想展平下面的前两行,并且可能将关键字组合在一起,使它们在同一列中。我怎么能简单地使用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
仍然不会生成具有正确值的关键字列。
答案 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