【发布时间】:2012-08-15 22:20:49
【问题描述】:
我有两张桌子。一列有 2 列 - ID、标签。 tags 列是一个以逗号分隔的标签值列表。
我是第二张表,也有两列。一个是标签列表,每个标签都在自己的行中,第二列是该标签的标签。
我需要做的是为每个 ID 创建一个输出查询,使用分号分隔的标签标签列表,为在其列表中具有相应标签值的每个 id。
这是两个表的简短示例:
Table1 -
ID---Tags
1---tag1,tag2,tag3,tag6
2---tag2,tag4,tag5
3---tag3,tag8,tag9,tag10
4---tag1,tag2,tag6
5---tag1,tag4,tag5
Table2 -
tagname---taglabel
tag1--- Nice Name Tag1
tag2--- Nice Name Tag2
tag3--- Nice Name Tag3
tag4--- Nice Name Tag4
tag5--- Nice Name Tag5
tag6--- Nice Name Tag6
tag7--- Nice Name Tag7
tag8--- Nice Name Tag8
tag9--- Nice Name Tag9
tag10--- Nice Name Tag10
想要的结果集 -
ID---TagsNames
1---Nice Name Tag1,Nice Name Tag2,Nice Name Tag3,Nice Name Tag6
2---Nice Name Tag2,Nice Name Tag4,Nice Name Tag5
3---Nice Name Tag3,Nice Name Tag8,Nice Name Tag9,Nice Name Tag10
4---Nice Name Tag1,Nice Name Tag2,Nice Name Tag6
5---Nice Name Tag1,Nice Name Tag4,Nice Name Tag5
我尝试为初始连接设置查询,认为我可以获取该结果集并将行连接起来,但我似乎无法让部分连接工作。这是那个查询:
SELECT gt.id as g
,gt.tags as tg
,tt.HitTagName as ht
,tt.termlabel as tl
FROM tblidtags gt (nolock)
JOIN tbltaglabels tt (Nolock) ON gt.tg like '%' + tt.ht + '%'
非常感谢任何建议!
【问题讨论】:
-
我认为这实际上应该是 JOIN tbltaglabels tt (Nolock) ON tt.ht like '%' + gt.tg + '%' ,但它仍然不起作用
-
我收到此错误,只是为了提供详细信息:消息 207,级别 16,状态 1,第 7 行无效的列名称“ht”。消息 207,级别 16,状态 1,第 7 行无效的列名称“tg”。
-
那个
tags列是多值列,是SQL中万恶之源之一。不要使用它们。在处理该列时,您将遇到比其他任何事情更多的问题。 -
我别无选择。这是我接收数据的方式
-
我必须将标签列从 ntext 转换为 nvarchar。现在我有这个 SELECT gt.id as g ,gt.tags as tg ,tt.HitTagName as ht ,tt.termlabel as tl FROM tblidtags gt (nolock) left JOIN tbltaglabels tt (Nolock) ON tt.HitTagName like '%' + gt.tags + '%' 。它开始运行,但随后我收到消息:Msg 8152, Level 16, State 10, Line 2 字符串或二进制数据将被截断。
标签: sql sql-server-2008 join concatenation partial