当前位置: 代码迷 >> Sql Server >> 有关问题表述的不是太清楚,详情请进
  详细解决方案

有关问题表述的不是太清楚,详情请进

热度:51   发布时间:2016-04-27 12:19:52.0
问题表述的不是太清楚,详情请进。
问题是这样,需要用到Tag标签。
想了两个办法。


1.直接存取。
在表里多加一列,字符串类型。
例如“拉面,红烧面,方便面”
用,号分割

2.关联Tag表
存取关联Tag表的ID


方案1倒是蛮好解决,搜索Tag时直接用Like去匹配数据。
方案2的话,某条记录有多个Tag标签该怎么匹配Tag关联表的文字描述信息呢?


如下:
A表(记录表)
ID Tag
-----------
1 1,2,3
2 1,3
3 2,3

B表(Tag关联表)
ID 描述
-------------
1 拉面
2 方便面
3 牛肉面

想要的结果

ID Tag TagName
-------------------
1 1,2,3 拉面,方便面,牛肉面
2 1,3 拉面,牛肉面
3 2,3 方便面,牛肉面


谢谢帮忙的兄弟姐妹。


------解决方案--------------------
SQL code
--A表(记录表)DECLARE @A TABLE(id INT,Tag VARCHAR(10))--ID Tag-----------INSERT INTO @ASELECT 1, '1,2,3' UNION ALLSELECT 2, '1,3' UNION ALLSELECT 3, '2,3'DECLARE @B TABLE(id INT,描述 VARCHAR(10))-------------INSERT INTO @BSELECT 1, '拉面' UNION ALLSELECT 2, '方便面' UNION ALLSELECT 3, '牛肉面' SELECT a.id,a.Tag,TagName=STUFF((SELECT ','+描述 FROM @B WHERE CHARINDEX(','+CAST(id AS VARCHAR(4))+',',','+a.Tag+',' )>0 FOR XML PATH('')),1,1,'')FROM @A  aGROUP BY a.id,Tag/*id          Tag        TagName----------- ---------- -------------------------1           1,2,3      拉面,方便面,牛肉面2           1,3        拉面,牛肉面3           2,3        方便面,牛肉面(3 行受影响)*/
------解决方案--------------------
SQL code
--> 测试数据:[A表]if object_id('[A表]') is not null drop table [A表]create table [A表]([ID] int,[Tag] varchar(5))goinsert [A表]select 1,'1,2,3' union allselect 2,'1,3' union allselect 3,'2,3'go--> 测试数据:[B表]if object_id('[B表]') is not null drop table [B表]create table [B表]([ID] int,[描述] varchar(6))goinsert [B表]select 1,'拉面' union allselect 2,'方便面' union allselect 3,'牛肉面'go;with tas(select a.*,b.描述from [A表] a,[B表] b where CHARINDEX(LTRIM(b.[ID]),a.Tag)>0)SELECT *FROM (SELECT DISTINCT Id,Tag FROM t)AOUTER APPLY(    SELECT [描述]= STUFF(REPLACE(REPLACE(            (   SELECT [描述] FROM t N                WHERE id = A.id and Tag=a.Tag                FOR XML AUTO             ), '<b 描述="', ','), '"/>', ''), 1, 1, ''))N/*Id    Tag    描述---------------------------------1    1,2,3    拉面,方便面,牛肉面2    1,3    拉面,牛肉面3    2,3    方便面,牛肉面*/
  相关解决方案