日期:2014-05-18  浏览次数:20544 次

请教高手一个SQL语句
表A
id     userid     typeid
1         01           01,02,03,
2         02           02,04,

表B
typeid       name
01               老虎
02               狮子
03               大象
04               兔子
05               猴子

要得到
表C
userid     typeid       name
01             01               老虎
01             02               狮子
01             03               大象
02             02               狮子
02             04               兔子

先谢谢各位前辈了~!

------解决方案--------------------
--不用函数也可以做的
declare @t1 table(id int,userid varchar(10),typeid varchar(50))
declare @t2 table(typeid varchar(10),name varchar(20))
insert into @t1
select 1, '01 ', '01,02,03, '
union all select 2, '02 ', '02,04, '
insert into @t2
select '01 ', '老虎 '
union all select '02 ', '狮子 '
union all select '03 ', '大象 '
union all select '04 ', '兔子 '
union all select '05 ', '猴子 '
--要得到
--表C
--userid typeid name
--01 01 老虎
--01 02 狮子
--01 03 大象
--02 02 狮子
--02 04 兔子
select a.userid,b.typeid,b.name
from @t1 a left join @t2 b on charindex( ', '+b.typeid+ ', ', ', '+a.typeid+ ', ')> 0
order by a.userid,b.typeid

/*结果
userid typeid name
---------- ---------- --------------------
01 01 老虎
01 02 狮子
01 03 大象
02 02 狮子
02 04 兔子
*/
------解决方案--------------------
---创建测试环境
Create Table A(id int,userid varchar(10),typeid varchar(10))
Insert A Select 1, '01 ', '01,02,03, '
Union All Select 2, '02 ', '02,04, '
Go
Create Table B(typeid varchar(10),name varchar(10))
Insert B Select '01 ', '老虎 '
Union All Select '02 ', '狮子 '
Union All Select '03 ', '大象 '
Union All Select '04 ', '兔子 '
Union All Select '05 ', '猴子 '
Go
---查询结果
Select
A.userid,
B.typeid,
B.name
From
A
Left Join B
On
Charindex( ', '+B.typeid+ ', ', ', '+A.typeid+ ', ')> 0
Order By A.userid,B.typeid

---清除测试环境
Drop Table A,B
---结果
/*
userid typeid name
---------- ---------- ----------
01 01 老虎
01 02 狮子
01 03 大象
02 02 狮子
02 04 兔子

(所影响的行数为 5 行)